@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
|
@@ -2681,6 +2681,70 @@ class ExternalApp {
|
|
|
2681
2681
|
|
|
2682
2682
|
//
|
|
2683
2683
|
|
|
2684
|
+
class MeetingAuthorization {
|
|
2685
|
+
|
|
2686
|
+
|
|
2687
|
+
|
|
2688
|
+
|
|
2689
|
+
|
|
2690
|
+
|
|
2691
|
+
constructor({
|
|
2692
|
+
meetingUuid,
|
|
2693
|
+
uuid,
|
|
2694
|
+
userUuid,
|
|
2695
|
+
userName,
|
|
2696
|
+
} = {}) {
|
|
2697
|
+
this.meetingUuid = meetingUuid;
|
|
2698
|
+
this.uuid = uuid;
|
|
2699
|
+
this.userUuid = userUuid;
|
|
2700
|
+
this.userName = userName;
|
|
2701
|
+
}
|
|
2702
|
+
|
|
2703
|
+
setStatus(status ) {
|
|
2704
|
+
this.status = status;
|
|
2705
|
+
}
|
|
2706
|
+
|
|
2707
|
+
getStatus() {
|
|
2708
|
+
return this.status;
|
|
2709
|
+
}
|
|
2710
|
+
|
|
2711
|
+
static parse(plain ) {
|
|
2712
|
+
const {
|
|
2713
|
+
meeting_uuid: meetingUuid,
|
|
2714
|
+
uuid,
|
|
2715
|
+
guest_uuid: userUuid,
|
|
2716
|
+
guest_name: userName,
|
|
2717
|
+
} = plain;
|
|
2718
|
+
|
|
2719
|
+
return new MeetingAuthorization({
|
|
2720
|
+
meetingUuid,
|
|
2721
|
+
uuid,
|
|
2722
|
+
userUuid,
|
|
2723
|
+
userName,
|
|
2724
|
+
});
|
|
2725
|
+
}
|
|
2726
|
+
|
|
2727
|
+
static parseMany(items ) {
|
|
2728
|
+
if (!items) {
|
|
2729
|
+
return [];
|
|
2730
|
+
}
|
|
2731
|
+
return items.map(MeetingAuthorization.parse);
|
|
2732
|
+
}
|
|
2733
|
+
}
|
|
2734
|
+
|
|
2735
|
+
//
|
|
2736
|
+
|
|
2737
|
+
|
|
2738
|
+
|
|
2739
|
+
|
|
2740
|
+
|
|
2741
|
+
|
|
2742
|
+
|
|
2743
|
+
|
|
2744
|
+
|
|
2745
|
+
|
|
2746
|
+
|
|
2747
|
+
|
|
2684
2748
|
|
|
2685
2749
|
|
|
2686
2750
|
|
|
@@ -2691,6 +2755,7 @@ class ExternalApp {
|
|
|
2691
2755
|
|
|
2692
2756
|
|
|
2693
2757
|
|
|
2758
|
+
|
|
2694
2759
|
|
|
2695
2760
|
|
|
2696
2761
|
class Meeting {
|
|
@@ -2705,6 +2770,8 @@ class Meeting {
|
|
|
2705
2770
|
|
|
2706
2771
|
|
|
2707
2772
|
|
|
2773
|
+
|
|
2774
|
+
|
|
2708
2775
|
|
|
2709
2776
|
static parse(plain ) {
|
|
2710
2777
|
return new Meeting({
|
|
@@ -2717,6 +2784,7 @@ class Meeting {
|
|
|
2717
2784
|
extension: plain.exten,
|
|
2718
2785
|
persistent: plain.persistent,
|
|
2719
2786
|
creationTime: moment__default['default'](plain.creation_time).toDate(),
|
|
2787
|
+
requireAuthorization: plain.require_authorization,
|
|
2720
2788
|
});
|
|
2721
2789
|
}
|
|
2722
2790
|
|
|
@@ -2741,6 +2809,7 @@ class Meeting {
|
|
|
2741
2809
|
extension,
|
|
2742
2810
|
persistent,
|
|
2743
2811
|
creationTime,
|
|
2812
|
+
requireAuthorization,
|
|
2744
2813
|
} = {}) {
|
|
2745
2814
|
this.guestSipAuthorization = guestSipAuthorization;
|
|
2746
2815
|
this.uri = uri;
|
|
@@ -2751,6 +2820,7 @@ class Meeting {
|
|
|
2751
2820
|
this.extension = extension;
|
|
2752
2821
|
this.persistent = persistent;
|
|
2753
2822
|
this.creationTime = creationTime;
|
|
2823
|
+
this.requireAuthorization = requireAuthorization;
|
|
2754
2824
|
|
|
2755
2825
|
// Useful to compare instead of instanceof with minified code
|
|
2756
2826
|
this.type = 'Meeting';
|
|
@@ -2761,8 +2831,32 @@ class Meeting {
|
|
|
2761
2831
|
const [username, secret] = atob(this.guestSipAuthorization).split(':');
|
|
2762
2832
|
return { username, secret };
|
|
2763
2833
|
}
|
|
2834
|
+
|
|
2764
2835
|
}
|
|
2765
2836
|
|
|
2837
|
+
//
|
|
2838
|
+
|
|
2839
|
+
const camelToUnderscore = (key ) => {
|
|
2840
|
+
if (typeof key !== 'string') {
|
|
2841
|
+
throw new Error('Input is not a string');
|
|
2842
|
+
}
|
|
2843
|
+
return key.charAt(0).toLowerCase() + key.substring(1).replace(/([A-Z])/g, '_$1').toLowerCase();
|
|
2844
|
+
};
|
|
2845
|
+
|
|
2846
|
+
//
|
|
2847
|
+
|
|
2848
|
+
const convertKeysFromCamelToUnderscore = (args ) => {
|
|
2849
|
+
if (!args || typeof args !== 'object' || Array.isArray(args)) {
|
|
2850
|
+
throw new Error('Input is not an object');
|
|
2851
|
+
}
|
|
2852
|
+
|
|
2853
|
+
return Object.keys(args).reduce((acc, key) => {
|
|
2854
|
+
acc[camelToUnderscore(key)] = typeof args[key] === 'object' && !Array.isArray(args[key])
|
|
2855
|
+
? convertKeysFromCamelToUnderscore(args[key]) : args[key];
|
|
2856
|
+
return acc;
|
|
2857
|
+
}, {});
|
|
2858
|
+
};
|
|
2859
|
+
|
|
2766
2860
|
/* */
|
|
2767
2861
|
|
|
2768
2862
|
var confdMethods = (client , baseUrl ) => ({
|
|
@@ -2831,8 +2925,18 @@ var confdMethods = (client , baseUrl ) => ({
|
|
|
2831
2925
|
getMyMeetings: () =>
|
|
2832
2926
|
client.get(`${baseUrl}/users/me/meetings`).then(response => Meeting.parseMany(response.items)),
|
|
2833
2927
|
|
|
2834
|
-
createMyMeeting: (
|
|
2835
|
-
client
|
|
2928
|
+
createMyMeeting: (args ) =>
|
|
2929
|
+
client
|
|
2930
|
+
.post(`${baseUrl}/users/me/meetings`, convertKeysFromCamelToUnderscore(args))
|
|
2931
|
+
.then(Meeting.parse),
|
|
2932
|
+
|
|
2933
|
+
updateMyMeeting: (meetingUuid , data ) =>
|
|
2934
|
+
client.put(
|
|
2935
|
+
`${baseUrl}/users/me/meetings/${meetingUuid}`,
|
|
2936
|
+
convertKeysFromCamelToUnderscore(data),
|
|
2937
|
+
null,
|
|
2938
|
+
ApiRequester.successResponseParser,
|
|
2939
|
+
),
|
|
2836
2940
|
|
|
2837
2941
|
deleteMyMeeting: (meetingUuid ) =>
|
|
2838
2942
|
client.delete(`${baseUrl}/users/me/meetings/${meetingUuid}`, null),
|
|
@@ -2840,8 +2944,36 @@ var confdMethods = (client , baseUrl ) => ({
|
|
|
2840
2944
|
getMeeting: (meetingUuid ) =>
|
|
2841
2945
|
client.get(`${baseUrl}/meetings/${meetingUuid}`, null).then(Meeting.parse),
|
|
2842
2946
|
|
|
2947
|
+
meetingAuthorizations: (meetingUuid ) =>
|
|
2948
|
+
client.get(`${baseUrl}/users/me/meetings/${meetingUuid}/authorizations`, null).then(MeetingAuthorization.parseMany),
|
|
2949
|
+
|
|
2950
|
+
meetingAuthorizationReject: (meetingUuid , authorizationUuid ) =>
|
|
2951
|
+
client.put(
|
|
2952
|
+
`${baseUrl}/users/me/meetings/${meetingUuid}/authorizations/${authorizationUuid}/reject`,
|
|
2953
|
+
{},
|
|
2954
|
+
null,
|
|
2955
|
+
ApiRequester.successResponseParser,
|
|
2956
|
+
),
|
|
2957
|
+
|
|
2958
|
+
meetingAuthorizationAccept: (meetingUuid , authorizationUuid ) =>
|
|
2959
|
+
client.put(
|
|
2960
|
+
`${baseUrl}/users/me/meetings/${meetingUuid}/authorizations/${authorizationUuid}/accept`,
|
|
2961
|
+
{},
|
|
2962
|
+
null,
|
|
2963
|
+
ApiRequester.successResponseParser,
|
|
2964
|
+
),
|
|
2965
|
+
|
|
2843
2966
|
guestGetMeeting: (meetingUuid ) =>
|
|
2844
2967
|
client.get(`${baseUrl}/guests/me/meetings/${meetingUuid}`, null).then(Meeting.parse),
|
|
2968
|
+
|
|
2969
|
+
guestAuthorizationRequest: (userUuid , meetingUuid , username ) =>
|
|
2970
|
+
client
|
|
2971
|
+
.post(`${baseUrl}/guests/${userUuid}/meetings/${meetingUuid}/authorizations`, { guest_name: username })
|
|
2972
|
+
.then(MeetingAuthorization.parse),
|
|
2973
|
+
|
|
2974
|
+
guestAuthorizationCheck: (userUuid , meetingUuid , authorizationUuid ) =>
|
|
2975
|
+
client.get(`${baseUrl}/guests/${userUuid}/meetings/${meetingUuid}/authorizations/${authorizationUuid}`, null),
|
|
2976
|
+
|
|
2845
2977
|
});
|
|
2846
2978
|
|
|
2847
2979
|
//
|
|
@@ -3107,6 +3239,7 @@ const RECORD_STATE_ACTIVE = 'active';
|
|
|
3107
3239
|
|
|
3108
3240
|
|
|
3109
3241
|
|
|
3242
|
+
|
|
3110
3243
|
|
|
3111
3244
|
|
|
3112
3245
|
|
|
@@ -3117,6 +3250,7 @@ const RECORD_STATE_ACTIVE = 'active';
|
|
|
3117
3250
|
|
|
3118
3251
|
|
|
3119
3252
|
|
|
3253
|
+
|
|
3120
3254
|
|
|
3121
3255
|
|
|
3122
3256
|
|
|
@@ -3145,6 +3279,7 @@ class Call {
|
|
|
3145
3279
|
|
|
3146
3280
|
|
|
3147
3281
|
|
|
3282
|
+
|
|
3148
3283
|
|
|
3149
3284
|
|
|
3150
3285
|
|
|
@@ -3169,6 +3304,7 @@ class Call {
|
|
|
3169
3304
|
calleeNumber: plain.peer_caller_id_number,
|
|
3170
3305
|
dialedExtension: plain.dialed_extension,
|
|
3171
3306
|
isCaller: plain.is_caller,
|
|
3307
|
+
isVideo: plain.is_video,
|
|
3172
3308
|
muted: plain.muted,
|
|
3173
3309
|
onHold: plain.on_hold,
|
|
3174
3310
|
status: plain.status,
|
|
@@ -3192,6 +3328,7 @@ class Call {
|
|
|
3192
3328
|
calleeNumber,
|
|
3193
3329
|
dialedExtension,
|
|
3194
3330
|
isCaller,
|
|
3331
|
+
isVideo,
|
|
3195
3332
|
lineId,
|
|
3196
3333
|
muted,
|
|
3197
3334
|
onHold,
|
|
@@ -3215,6 +3352,7 @@ class Call {
|
|
|
3215
3352
|
this.startingTime = startingTime;
|
|
3216
3353
|
this.talkingToIds = talkingToIds || [];
|
|
3217
3354
|
this.recording = recording;
|
|
3355
|
+
this.isVideo = !!isVideo;
|
|
3218
3356
|
|
|
3219
3357
|
// Useful to compare instead of instanceof with minified code
|
|
3220
3358
|
this.type = 'Call';
|
|
@@ -3688,7 +3826,7 @@ class CallSession {
|
|
|
3688
3826
|
ringing: call.isRinging(),
|
|
3689
3827
|
answered: call.isUp(),
|
|
3690
3828
|
answeredBySystem: call.isUp() && call.talkingToIds.length === 0,
|
|
3691
|
-
cameraEnabled:
|
|
3829
|
+
cameraEnabled: call.isVideo,
|
|
3692
3830
|
dialedExtension: call.dialedExtension,
|
|
3693
3831
|
call,
|
|
3694
3832
|
conference: false, // @FIXME?
|
|
@@ -5060,6 +5198,14 @@ var calldMethods = (client , baseUrl ) => ({
|
|
|
5060
5198
|
getMeetingParticipantsAsUser: async (meetingUuid ) =>
|
|
5061
5199
|
client.get(`${baseUrl}/users/me/meetings/${meetingUuid}/participants`),
|
|
5062
5200
|
|
|
5201
|
+
banMeetingParticipant: (meetingUuid , participantUuid ) =>
|
|
5202
|
+
client.delete(
|
|
5203
|
+
`${baseUrl}/users/me/meetings/${meetingUuid}/participants/${participantUuid}`,
|
|
5204
|
+
null,
|
|
5205
|
+
null,
|
|
5206
|
+
ApiRequester.successResponseParser,
|
|
5207
|
+
),
|
|
5208
|
+
|
|
5063
5209
|
listTrunks: () => client.get(`${baseUrl}/trunks`),
|
|
5064
5210
|
|
|
5065
5211
|
mute: (callId ) =>
|
|
@@ -6208,6 +6354,24 @@ const fixSdp = (sdp , candidates , forcePort = true)
|
|
|
6208
6354
|
return fixed;
|
|
6209
6355
|
};
|
|
6210
6356
|
|
|
6357
|
+
const addIcesInAllBundles = (sdp ) => {
|
|
6358
|
+
const parsedSdp = sdpParser__default['default'].parse(sdp);
|
|
6359
|
+
|
|
6360
|
+
const mediaWithCandidate = parsedSdp.media.find(media => !!media.candidates);
|
|
6361
|
+
if (!mediaWithCandidate) {
|
|
6362
|
+
return sdp;
|
|
6363
|
+
}
|
|
6364
|
+
|
|
6365
|
+
const { candidates } = mediaWithCandidate;
|
|
6366
|
+
|
|
6367
|
+
parsedSdp.media = parsedSdp.media.map(media => ({
|
|
6368
|
+
...media,
|
|
6369
|
+
candidates: media.candidates || candidates,
|
|
6370
|
+
}));
|
|
6371
|
+
|
|
6372
|
+
return sdpParser__default['default'].write(parsedSdp);
|
|
6373
|
+
};
|
|
6374
|
+
|
|
6211
6375
|
/* global RTCSessionDescriptionInit, navigator */
|
|
6212
6376
|
|
|
6213
6377
|
const wazoLogger = IssueReporter$1 ? IssueReporter$1.loggerFor('webrtc-sdh') : console;
|
|
@@ -6337,7 +6501,10 @@ class WazoSessionDescriptionHandler extends sessionDescriptionHandler.SessionDes
|
|
|
6337
6501
|
|
|
6338
6502
|
// Check if we got ICEs
|
|
6339
6503
|
if (sdp.indexOf('a=candidate') !== -1) {
|
|
6340
|
-
return
|
|
6504
|
+
return {
|
|
6505
|
+
type: description.type,
|
|
6506
|
+
sdp: addIcesInAllBundles(sdp),
|
|
6507
|
+
};
|
|
6341
6508
|
}
|
|
6342
6509
|
|
|
6343
6510
|
wazoLogger.info('No ICE candidates found in SDP, fixing it with gathered ices', this.gatheredCandidates);
|
|
@@ -7797,41 +7964,58 @@ class WebRTCClient extends Emitter {
|
|
|
7797
7964
|
});
|
|
7798
7965
|
}
|
|
7799
7966
|
|
|
7800
|
-
changeAudioInputDevice(id , session ) {
|
|
7967
|
+
async changeAudioInputDevice(id , session , force ) {
|
|
7801
7968
|
const currentId = this.getAudioDeviceId();
|
|
7802
7969
|
logger$8.info('setting audio input device', { id, currentId, session: !!session });
|
|
7803
7970
|
|
|
7804
|
-
if (id === currentId) {
|
|
7971
|
+
if (!force && id === currentId) {
|
|
7805
7972
|
return null;
|
|
7806
7973
|
}
|
|
7807
7974
|
|
|
7975
|
+
// in order to handle an audio track change for default devices
|
|
7976
|
+
// we need the actual id of the device (not 'default')
|
|
7977
|
+
let deviceId = id;
|
|
7978
|
+
if (id === 'default' && navigator.mediaDevices) {
|
|
7979
|
+
const devices = await navigator.mediaDevices.enumerateDevices();
|
|
7980
|
+
const defaultDevice = devices.find(device => device.deviceId === 'default');
|
|
7981
|
+
if (defaultDevice) {
|
|
7982
|
+
const deviceLabel = defaultDevice.label.replace('Default - ', '');
|
|
7983
|
+
const targetDevice = devices.find(device => device.label === deviceLabel);
|
|
7984
|
+
if (targetDevice) {
|
|
7985
|
+
deviceId = targetDevice.deviceId;
|
|
7986
|
+
if (!force && deviceId === currentId) {
|
|
7987
|
+
return null;
|
|
7988
|
+
}
|
|
7989
|
+
}
|
|
7990
|
+
}
|
|
7991
|
+
}
|
|
7992
|
+
|
|
7808
7993
|
// let's update the local audio value
|
|
7809
7994
|
if (this.audio) {
|
|
7810
7995
|
this.audio = {
|
|
7811
7996
|
deviceId: {
|
|
7812
|
-
exact:
|
|
7997
|
+
exact: deviceId,
|
|
7813
7998
|
},
|
|
7814
7999
|
};
|
|
7815
8000
|
}
|
|
7816
8001
|
|
|
7817
|
-
if (session) {
|
|
8002
|
+
if (session && navigator.mediaDevices) {
|
|
7818
8003
|
const sdh = session.sessionDescriptionHandler;
|
|
7819
8004
|
const pc = sdh.peerConnection;
|
|
7820
8005
|
|
|
7821
|
-
|
|
7822
|
-
|
|
7823
|
-
|
|
7824
|
-
|
|
8006
|
+
const constraints = { audio: { deviceId: { exact: deviceId } } };
|
|
8007
|
+
const stream = await navigator.mediaDevices.getUserMedia(constraints);
|
|
8008
|
+
const audioTrack = stream.getAudioTracks()[0];
|
|
8009
|
+
const sender = pc && pc.getSenders().find(s => audioTrack && s && s.track && s.track.kind === audioTrack.kind);
|
|
7825
8010
|
|
|
7826
|
-
|
|
7827
|
-
|
|
7828
|
-
|
|
7829
|
-
}
|
|
7830
|
-
sender.replaceTrack(audioTrack);
|
|
8011
|
+
if (sender) {
|
|
8012
|
+
if (sender.track) {
|
|
8013
|
+
audioTrack.enabled = sender.track.enabled;
|
|
7831
8014
|
}
|
|
8015
|
+
sender.replaceTrack(audioTrack);
|
|
8016
|
+
}
|
|
7832
8017
|
|
|
7833
|
-
|
|
7834
|
-
});
|
|
8018
|
+
return stream;
|
|
7835
8019
|
}
|
|
7836
8020
|
}
|
|
7837
8021
|
|
|
@@ -7851,14 +8035,14 @@ class WebRTCClient extends Emitter {
|
|
|
7851
8035
|
return null;
|
|
7852
8036
|
}
|
|
7853
8037
|
|
|
7854
|
-
// let's
|
|
7855
|
-
|
|
7856
|
-
|
|
7857
|
-
|
|
7858
|
-
|
|
7859
|
-
|
|
7860
|
-
}
|
|
7861
|
-
}
|
|
8038
|
+
// let's make sure we don't lose other video constraints settings -- width, height, frameRate...
|
|
8039
|
+
const videoObject = typeof this.video === 'object' ? this.video : {};
|
|
8040
|
+
this.video = {
|
|
8041
|
+
...videoObject,
|
|
8042
|
+
deviceId: {
|
|
8043
|
+
exact: id,
|
|
8044
|
+
},
|
|
8045
|
+
};
|
|
7862
8046
|
}
|
|
7863
8047
|
|
|
7864
8048
|
changeSessionVideoInputDevice(id , session ) {
|
|
@@ -9597,10 +9781,10 @@ class WebRTCPhone extends Emitter {
|
|
|
9597
9781
|
this.audioRingVolume = volume;
|
|
9598
9782
|
}
|
|
9599
9783
|
|
|
9600
|
-
changeAudioInputDevice(id ) {
|
|
9784
|
+
changeAudioInputDevice(id , force ) {
|
|
9601
9785
|
logger$7.info('WebRTC phone - changeAudio input device', { deviceId: id });
|
|
9602
9786
|
|
|
9603
|
-
return this.client.changeAudioInputDevice(id, this.currentSipSession);
|
|
9787
|
+
return this.client.changeAudioInputDevice(id, this.currentSipSession, force);
|
|
9604
9788
|
}
|
|
9605
9789
|
|
|
9606
9790
|
changeVideoInputDevice(id ) {
|
|
@@ -11253,6 +11437,7 @@ const AGENT_UNPAUSED = 'agent_unpaused';
|
|
|
11253
11437
|
const CONFERENCE_ADHOC_PARTICIPANT_LEFT = 'conference_adhoc_participant_left';
|
|
11254
11438
|
const CONFERENCE_ADHOC_DELETED = 'conference_adhoc_deleted';
|
|
11255
11439
|
const MEETING_USER_PROGRESS = 'meeting_user_progress';
|
|
11440
|
+
const MEETING_USER_GUEST_AUTHORIZATION_CREATED = 'meeting_user_guest_authorization_created';
|
|
11256
11441
|
|
|
11257
11442
|
const BLACKLIST_EVENTS = [
|
|
11258
11443
|
CHAT_MESSAGE_SENT,
|
|
@@ -11604,6 +11789,7 @@ WebSocketClient.eventLists = [
|
|
|
11604
11789
|
CONFERENCE_ADHOC_PARTICIPANT_LEFT,
|
|
11605
11790
|
CONFERENCE_ADHOC_DELETED,
|
|
11606
11791
|
MEETING_USER_PROGRESS,
|
|
11792
|
+
MEETING_USER_GUEST_AUTHORIZATION_CREATED,
|
|
11607
11793
|
];
|
|
11608
11794
|
|
|
11609
11795
|
var WebSocketClient$1 = /*#__PURE__*/Object.freeze({
|
|
@@ -11675,6 +11861,7 @@ var WebSocketClient$1 = /*#__PURE__*/Object.freeze({
|
|
|
11675
11861
|
CONFERENCE_ADHOC_PARTICIPANT_LEFT: CONFERENCE_ADHOC_PARTICIPANT_LEFT,
|
|
11676
11862
|
CONFERENCE_ADHOC_DELETED: CONFERENCE_ADHOC_DELETED,
|
|
11677
11863
|
MEETING_USER_PROGRESS: MEETING_USER_PROGRESS,
|
|
11864
|
+
MEETING_USER_GUEST_AUTHORIZATION_CREATED: MEETING_USER_GUEST_AUTHORIZATION_CREATED,
|
|
11678
11865
|
HEARTBEAT_ENGINE_VERSION: HEARTBEAT_ENGINE_VERSION,
|
|
11679
11866
|
'default': WebSocketClient
|
|
11680
11867
|
});
|
|
@@ -11772,7 +11959,7 @@ class SipRoom extends Room {
|
|
|
11772
11959
|
logger$3.info('connecting to sip room', { extension, audioOnly, room: !!room });
|
|
11773
11960
|
|
|
11774
11961
|
if (!room) {
|
|
11775
|
-
await Wazo.Phone.connect();
|
|
11962
|
+
await Wazo.Phone.connect({ media: constraints });
|
|
11776
11963
|
|
|
11777
11964
|
const withCamera = constraints && !!constraints.video;
|
|
11778
11965
|
|
|
@@ -13454,7 +13641,7 @@ class Room extends Emitter {
|
|
|
13454
13641
|
logger$1.info('connecting to room', { extension, audioOnly, room: !!room });
|
|
13455
13642
|
|
|
13456
13643
|
if (!room) {
|
|
13457
|
-
await Wazo.Phone.connect();
|
|
13644
|
+
await Wazo.Phone.connect({ media: constraints });
|
|
13458
13645
|
|
|
13459
13646
|
const withCamera = constraints && !!constraints.video;
|
|
13460
13647
|
|
|
@@ -13899,7 +14086,7 @@ class Room extends Emitter {
|
|
|
13899
14086
|
const participant = this._getParticipantFromCallId(status.callId);
|
|
13900
14087
|
|
|
13901
14088
|
if (participant) {
|
|
13902
|
-
// we're
|
|
14089
|
+
// we're receiving, so no need to broadcast
|
|
13903
14090
|
participant.updateStatus(status, false);
|
|
13904
14091
|
}
|
|
13905
14092
|
break;
|
|
@@ -14173,6 +14360,7 @@ class Participant extends Emitter {
|
|
|
14173
14360
|
|
|
14174
14361
|
|
|
14175
14362
|
|
|
14363
|
+
|
|
14176
14364
|
|
|
14177
14365
|
|
|
14178
14366
|
|
|
@@ -14190,6 +14378,7 @@ class Participant extends Emitter {
|
|
|
14190
14378
|
|
|
14191
14379
|
|
|
14192
14380
|
|
|
14381
|
+
|
|
14193
14382
|
|
|
14194
14383
|
/**
|
|
14195
14384
|
* @param room Room The room where the participant is
|
|
@@ -14213,6 +14402,7 @@ class Participant extends Emitter {
|
|
|
14213
14402
|
this.screensharing = false;
|
|
14214
14403
|
this.isOnHold = false;
|
|
14215
14404
|
this.extra = extra;
|
|
14405
|
+
this.banned = false;
|
|
14216
14406
|
|
|
14217
14407
|
this.ON_UPDATED = 'participant/ON_UPDATED';
|
|
14218
14408
|
this.ON_START_TALKING = 'participant/ON_START_TALKING';
|
|
@@ -14229,6 +14419,7 @@ class Participant extends Emitter {
|
|
|
14229
14419
|
this.ON_EXTRA_CHANGE = 'participant/ON_EXTRA_CHANGE';
|
|
14230
14420
|
this.ON_HOLD = 'participant/ON_HOLD';
|
|
14231
14421
|
this.ON_RESUME = 'participant/ON_RESUME';
|
|
14422
|
+
this.ON_BAN = 'participant/ON_BAN';
|
|
14232
14423
|
}
|
|
14233
14424
|
|
|
14234
14425
|
triggerEvent(name , ...args ) {
|
|
@@ -14269,6 +14460,10 @@ class Participant extends Emitter {
|
|
|
14269
14460
|
status.extra = this.extra;
|
|
14270
14461
|
break;
|
|
14271
14462
|
}
|
|
14463
|
+
case this.ON_BAN: {
|
|
14464
|
+
status.banned = true;
|
|
14465
|
+
break;
|
|
14466
|
+
}
|
|
14272
14467
|
}
|
|
14273
14468
|
|
|
14274
14469
|
if (broadcast) {
|
|
@@ -14371,6 +14566,11 @@ class Participant extends Emitter {
|
|
|
14371
14566
|
this.triggerUpdate(this.ON_RESUME, broadcast);
|
|
14372
14567
|
}
|
|
14373
14568
|
|
|
14569
|
+
onBan(broadcast = true) {
|
|
14570
|
+
this.banned = true;
|
|
14571
|
+
this.triggerUpdate(this.ON_BAN, broadcast);
|
|
14572
|
+
}
|
|
14573
|
+
|
|
14374
14574
|
getStatus() {
|
|
14375
14575
|
return {
|
|
14376
14576
|
callId: this.callId,
|
|
@@ -14417,6 +14617,10 @@ class Participant extends Emitter {
|
|
|
14417
14617
|
}
|
|
14418
14618
|
}
|
|
14419
14619
|
|
|
14620
|
+
if (status.banned) {
|
|
14621
|
+
this.onBan(false);
|
|
14622
|
+
}
|
|
14623
|
+
|
|
14420
14624
|
// Poor man's object comparison
|
|
14421
14625
|
if (typeof status.extra !== 'undefined' && JSON.stringify(this.extra) !== JSON.stringify(status.extra)) {
|
|
14422
14626
|
this.extra = { ...this.extra, ...status.extra };
|
|
@@ -14444,6 +14648,28 @@ class Participant extends Emitter {
|
|
|
14444
14648
|
this.streams = streams;
|
|
14445
14649
|
this.videoStreams = streams;
|
|
14446
14650
|
}
|
|
14651
|
+
|
|
14652
|
+
async ban(apiRequestDelay = null) {
|
|
14653
|
+
const { meetingUuid } = this.room;
|
|
14654
|
+
if (!meetingUuid) {
|
|
14655
|
+
throw new Error('Attempting to ban a participant without a `meetingUuid`');
|
|
14656
|
+
}
|
|
14657
|
+
|
|
14658
|
+
// this notifies all that someone is being banned
|
|
14659
|
+
this.onBan(true);
|
|
14660
|
+
|
|
14661
|
+
// this allows to delay the actual ban, in order for the banned participant as well as others to react to the situation
|
|
14662
|
+
if (apiRequestDelay) {
|
|
14663
|
+
await this.delay(apiRequestDelay);
|
|
14664
|
+
}
|
|
14665
|
+
|
|
14666
|
+
// proceed with the actual kick
|
|
14667
|
+
return getApiClient().calld.banMeetingParticipant(meetingUuid, this.callId);
|
|
14668
|
+
}
|
|
14669
|
+
|
|
14670
|
+
async delay(ms ) {
|
|
14671
|
+
return new Promise(resolve => setTimeout(resolve, ms));
|
|
14672
|
+
}
|
|
14447
14673
|
}
|
|
14448
14674
|
|
|
14449
14675
|
//
|