@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
|
@@ -2671,6 +2671,70 @@ class ExternalApp {
|
|
|
2671
2671
|
|
|
2672
2672
|
//
|
|
2673
2673
|
|
|
2674
|
+
class MeetingAuthorization {
|
|
2675
|
+
|
|
2676
|
+
|
|
2677
|
+
|
|
2678
|
+
|
|
2679
|
+
|
|
2680
|
+
|
|
2681
|
+
constructor({
|
|
2682
|
+
meetingUuid,
|
|
2683
|
+
uuid,
|
|
2684
|
+
userUuid,
|
|
2685
|
+
userName,
|
|
2686
|
+
} = {}) {
|
|
2687
|
+
this.meetingUuid = meetingUuid;
|
|
2688
|
+
this.uuid = uuid;
|
|
2689
|
+
this.userUuid = userUuid;
|
|
2690
|
+
this.userName = userName;
|
|
2691
|
+
}
|
|
2692
|
+
|
|
2693
|
+
setStatus(status ) {
|
|
2694
|
+
this.status = status;
|
|
2695
|
+
}
|
|
2696
|
+
|
|
2697
|
+
getStatus() {
|
|
2698
|
+
return this.status;
|
|
2699
|
+
}
|
|
2700
|
+
|
|
2701
|
+
static parse(plain ) {
|
|
2702
|
+
const {
|
|
2703
|
+
meeting_uuid: meetingUuid,
|
|
2704
|
+
uuid,
|
|
2705
|
+
guest_uuid: userUuid,
|
|
2706
|
+
guest_name: userName,
|
|
2707
|
+
} = plain;
|
|
2708
|
+
|
|
2709
|
+
return new MeetingAuthorization({
|
|
2710
|
+
meetingUuid,
|
|
2711
|
+
uuid,
|
|
2712
|
+
userUuid,
|
|
2713
|
+
userName,
|
|
2714
|
+
});
|
|
2715
|
+
}
|
|
2716
|
+
|
|
2717
|
+
static parseMany(items ) {
|
|
2718
|
+
if (!items) {
|
|
2719
|
+
return [];
|
|
2720
|
+
}
|
|
2721
|
+
return items.map(MeetingAuthorization.parse);
|
|
2722
|
+
}
|
|
2723
|
+
}
|
|
2724
|
+
|
|
2725
|
+
//
|
|
2726
|
+
|
|
2727
|
+
|
|
2728
|
+
|
|
2729
|
+
|
|
2730
|
+
|
|
2731
|
+
|
|
2732
|
+
|
|
2733
|
+
|
|
2734
|
+
|
|
2735
|
+
|
|
2736
|
+
|
|
2737
|
+
|
|
2674
2738
|
|
|
2675
2739
|
|
|
2676
2740
|
|
|
@@ -2681,6 +2745,7 @@ class ExternalApp {
|
|
|
2681
2745
|
|
|
2682
2746
|
|
|
2683
2747
|
|
|
2748
|
+
|
|
2684
2749
|
|
|
2685
2750
|
|
|
2686
2751
|
class Meeting {
|
|
@@ -2695,6 +2760,8 @@ class Meeting {
|
|
|
2695
2760
|
|
|
2696
2761
|
|
|
2697
2762
|
|
|
2763
|
+
|
|
2764
|
+
|
|
2698
2765
|
|
|
2699
2766
|
static parse(plain ) {
|
|
2700
2767
|
return new Meeting({
|
|
@@ -2707,6 +2774,7 @@ class Meeting {
|
|
|
2707
2774
|
extension: plain.exten,
|
|
2708
2775
|
persistent: plain.persistent,
|
|
2709
2776
|
creationTime: moment(plain.creation_time).toDate(),
|
|
2777
|
+
requireAuthorization: plain.require_authorization,
|
|
2710
2778
|
});
|
|
2711
2779
|
}
|
|
2712
2780
|
|
|
@@ -2731,6 +2799,7 @@ class Meeting {
|
|
|
2731
2799
|
extension,
|
|
2732
2800
|
persistent,
|
|
2733
2801
|
creationTime,
|
|
2802
|
+
requireAuthorization,
|
|
2734
2803
|
} = {}) {
|
|
2735
2804
|
this.guestSipAuthorization = guestSipAuthorization;
|
|
2736
2805
|
this.uri = uri;
|
|
@@ -2741,6 +2810,7 @@ class Meeting {
|
|
|
2741
2810
|
this.extension = extension;
|
|
2742
2811
|
this.persistent = persistent;
|
|
2743
2812
|
this.creationTime = creationTime;
|
|
2813
|
+
this.requireAuthorization = requireAuthorization;
|
|
2744
2814
|
|
|
2745
2815
|
// Useful to compare instead of instanceof with minified code
|
|
2746
2816
|
this.type = 'Meeting';
|
|
@@ -2751,8 +2821,32 @@ class Meeting {
|
|
|
2751
2821
|
const [username, secret] = atob(this.guestSipAuthorization).split(':');
|
|
2752
2822
|
return { username, secret };
|
|
2753
2823
|
}
|
|
2824
|
+
|
|
2754
2825
|
}
|
|
2755
2826
|
|
|
2827
|
+
//
|
|
2828
|
+
|
|
2829
|
+
const camelToUnderscore = (key ) => {
|
|
2830
|
+
if (typeof key !== 'string') {
|
|
2831
|
+
throw new Error('Input is not a string');
|
|
2832
|
+
}
|
|
2833
|
+
return key.charAt(0).toLowerCase() + key.substring(1).replace(/([A-Z])/g, '_$1').toLowerCase();
|
|
2834
|
+
};
|
|
2835
|
+
|
|
2836
|
+
//
|
|
2837
|
+
|
|
2838
|
+
const convertKeysFromCamelToUnderscore = (args ) => {
|
|
2839
|
+
if (!args || typeof args !== 'object' || Array.isArray(args)) {
|
|
2840
|
+
throw new Error('Input is not an object');
|
|
2841
|
+
}
|
|
2842
|
+
|
|
2843
|
+
return Object.keys(args).reduce((acc, key) => {
|
|
2844
|
+
acc[camelToUnderscore(key)] = typeof args[key] === 'object' && !Array.isArray(args[key])
|
|
2845
|
+
? convertKeysFromCamelToUnderscore(args[key]) : args[key];
|
|
2846
|
+
return acc;
|
|
2847
|
+
}, {});
|
|
2848
|
+
};
|
|
2849
|
+
|
|
2756
2850
|
/* */
|
|
2757
2851
|
|
|
2758
2852
|
var confdMethods = (client , baseUrl ) => ({
|
|
@@ -2821,8 +2915,18 @@ var confdMethods = (client , baseUrl ) => ({
|
|
|
2821
2915
|
getMyMeetings: () =>
|
|
2822
2916
|
client.get(`${baseUrl}/users/me/meetings`).then(response => Meeting.parseMany(response.items)),
|
|
2823
2917
|
|
|
2824
|
-
createMyMeeting: (
|
|
2825
|
-
client
|
|
2918
|
+
createMyMeeting: (args ) =>
|
|
2919
|
+
client
|
|
2920
|
+
.post(`${baseUrl}/users/me/meetings`, convertKeysFromCamelToUnderscore(args))
|
|
2921
|
+
.then(Meeting.parse),
|
|
2922
|
+
|
|
2923
|
+
updateMyMeeting: (meetingUuid , data ) =>
|
|
2924
|
+
client.put(
|
|
2925
|
+
`${baseUrl}/users/me/meetings/${meetingUuid}`,
|
|
2926
|
+
convertKeysFromCamelToUnderscore(data),
|
|
2927
|
+
null,
|
|
2928
|
+
ApiRequester.successResponseParser,
|
|
2929
|
+
),
|
|
2826
2930
|
|
|
2827
2931
|
deleteMyMeeting: (meetingUuid ) =>
|
|
2828
2932
|
client.delete(`${baseUrl}/users/me/meetings/${meetingUuid}`, null),
|
|
@@ -2830,8 +2934,36 @@ var confdMethods = (client , baseUrl ) => ({
|
|
|
2830
2934
|
getMeeting: (meetingUuid ) =>
|
|
2831
2935
|
client.get(`${baseUrl}/meetings/${meetingUuid}`, null).then(Meeting.parse),
|
|
2832
2936
|
|
|
2937
|
+
meetingAuthorizations: (meetingUuid ) =>
|
|
2938
|
+
client.get(`${baseUrl}/users/me/meetings/${meetingUuid}/authorizations`, null).then(MeetingAuthorization.parseMany),
|
|
2939
|
+
|
|
2940
|
+
meetingAuthorizationReject: (meetingUuid , authorizationUuid ) =>
|
|
2941
|
+
client.put(
|
|
2942
|
+
`${baseUrl}/users/me/meetings/${meetingUuid}/authorizations/${authorizationUuid}/reject`,
|
|
2943
|
+
{},
|
|
2944
|
+
null,
|
|
2945
|
+
ApiRequester.successResponseParser,
|
|
2946
|
+
),
|
|
2947
|
+
|
|
2948
|
+
meetingAuthorizationAccept: (meetingUuid , authorizationUuid ) =>
|
|
2949
|
+
client.put(
|
|
2950
|
+
`${baseUrl}/users/me/meetings/${meetingUuid}/authorizations/${authorizationUuid}/accept`,
|
|
2951
|
+
{},
|
|
2952
|
+
null,
|
|
2953
|
+
ApiRequester.successResponseParser,
|
|
2954
|
+
),
|
|
2955
|
+
|
|
2833
2956
|
guestGetMeeting: (meetingUuid ) =>
|
|
2834
2957
|
client.get(`${baseUrl}/guests/me/meetings/${meetingUuid}`, null).then(Meeting.parse),
|
|
2958
|
+
|
|
2959
|
+
guestAuthorizationRequest: (userUuid , meetingUuid , username ) =>
|
|
2960
|
+
client
|
|
2961
|
+
.post(`${baseUrl}/guests/${userUuid}/meetings/${meetingUuid}/authorizations`, { guest_name: username })
|
|
2962
|
+
.then(MeetingAuthorization.parse),
|
|
2963
|
+
|
|
2964
|
+
guestAuthorizationCheck: (userUuid , meetingUuid , authorizationUuid ) =>
|
|
2965
|
+
client.get(`${baseUrl}/guests/${userUuid}/meetings/${meetingUuid}/authorizations/${authorizationUuid}`, null),
|
|
2966
|
+
|
|
2835
2967
|
});
|
|
2836
2968
|
|
|
2837
2969
|
//
|
|
@@ -3097,6 +3229,7 @@ const RECORD_STATE_ACTIVE = 'active';
|
|
|
3097
3229
|
|
|
3098
3230
|
|
|
3099
3231
|
|
|
3232
|
+
|
|
3100
3233
|
|
|
3101
3234
|
|
|
3102
3235
|
|
|
@@ -3107,6 +3240,7 @@ const RECORD_STATE_ACTIVE = 'active';
|
|
|
3107
3240
|
|
|
3108
3241
|
|
|
3109
3242
|
|
|
3243
|
+
|
|
3110
3244
|
|
|
3111
3245
|
|
|
3112
3246
|
|
|
@@ -3135,6 +3269,7 @@ class Call {
|
|
|
3135
3269
|
|
|
3136
3270
|
|
|
3137
3271
|
|
|
3272
|
+
|
|
3138
3273
|
|
|
3139
3274
|
|
|
3140
3275
|
|
|
@@ -3159,6 +3294,7 @@ class Call {
|
|
|
3159
3294
|
calleeNumber: plain.peer_caller_id_number,
|
|
3160
3295
|
dialedExtension: plain.dialed_extension,
|
|
3161
3296
|
isCaller: plain.is_caller,
|
|
3297
|
+
isVideo: plain.is_video,
|
|
3162
3298
|
muted: plain.muted,
|
|
3163
3299
|
onHold: plain.on_hold,
|
|
3164
3300
|
status: plain.status,
|
|
@@ -3182,6 +3318,7 @@ class Call {
|
|
|
3182
3318
|
calleeNumber,
|
|
3183
3319
|
dialedExtension,
|
|
3184
3320
|
isCaller,
|
|
3321
|
+
isVideo,
|
|
3185
3322
|
lineId,
|
|
3186
3323
|
muted,
|
|
3187
3324
|
onHold,
|
|
@@ -3205,6 +3342,7 @@ class Call {
|
|
|
3205
3342
|
this.startingTime = startingTime;
|
|
3206
3343
|
this.talkingToIds = talkingToIds || [];
|
|
3207
3344
|
this.recording = recording;
|
|
3345
|
+
this.isVideo = !!isVideo;
|
|
3208
3346
|
|
|
3209
3347
|
// Useful to compare instead of instanceof with minified code
|
|
3210
3348
|
this.type = 'Call';
|
|
@@ -3678,7 +3816,7 @@ class CallSession {
|
|
|
3678
3816
|
ringing: call.isRinging(),
|
|
3679
3817
|
answered: call.isUp(),
|
|
3680
3818
|
answeredBySystem: call.isUp() && call.talkingToIds.length === 0,
|
|
3681
|
-
cameraEnabled:
|
|
3819
|
+
cameraEnabled: call.isVideo,
|
|
3682
3820
|
dialedExtension: call.dialedExtension,
|
|
3683
3821
|
call,
|
|
3684
3822
|
conference: false, // @FIXME?
|
|
@@ -5050,6 +5188,14 @@ var calldMethods = (client , baseUrl ) => ({
|
|
|
5050
5188
|
getMeetingParticipantsAsUser: async (meetingUuid ) =>
|
|
5051
5189
|
client.get(`${baseUrl}/users/me/meetings/${meetingUuid}/participants`),
|
|
5052
5190
|
|
|
5191
|
+
banMeetingParticipant: (meetingUuid , participantUuid ) =>
|
|
5192
|
+
client.delete(
|
|
5193
|
+
`${baseUrl}/users/me/meetings/${meetingUuid}/participants/${participantUuid}`,
|
|
5194
|
+
null,
|
|
5195
|
+
null,
|
|
5196
|
+
ApiRequester.successResponseParser,
|
|
5197
|
+
),
|
|
5198
|
+
|
|
5053
5199
|
listTrunks: () => client.get(`${baseUrl}/trunks`),
|
|
5054
5200
|
|
|
5055
5201
|
mute: (callId ) =>
|
|
@@ -6198,6 +6344,24 @@ const fixSdp = (sdp , candidates , forcePort = true)
|
|
|
6198
6344
|
return fixed;
|
|
6199
6345
|
};
|
|
6200
6346
|
|
|
6347
|
+
const addIcesInAllBundles = (sdp ) => {
|
|
6348
|
+
const parsedSdp = sdpParser.parse(sdp);
|
|
6349
|
+
|
|
6350
|
+
const mediaWithCandidate = parsedSdp.media.find(media => !!media.candidates);
|
|
6351
|
+
if (!mediaWithCandidate) {
|
|
6352
|
+
return sdp;
|
|
6353
|
+
}
|
|
6354
|
+
|
|
6355
|
+
const { candidates } = mediaWithCandidate;
|
|
6356
|
+
|
|
6357
|
+
parsedSdp.media = parsedSdp.media.map(media => ({
|
|
6358
|
+
...media,
|
|
6359
|
+
candidates: media.candidates || candidates,
|
|
6360
|
+
}));
|
|
6361
|
+
|
|
6362
|
+
return sdpParser.write(parsedSdp);
|
|
6363
|
+
};
|
|
6364
|
+
|
|
6201
6365
|
/* global RTCSessionDescriptionInit, navigator */
|
|
6202
6366
|
|
|
6203
6367
|
const wazoLogger = IssueReporter$1 ? IssueReporter$1.loggerFor('webrtc-sdh') : console;
|
|
@@ -6327,7 +6491,10 @@ class WazoSessionDescriptionHandler extends SessionDescriptionHandler {
|
|
|
6327
6491
|
|
|
6328
6492
|
// Check if we got ICEs
|
|
6329
6493
|
if (sdp.indexOf('a=candidate') !== -1) {
|
|
6330
|
-
return
|
|
6494
|
+
return {
|
|
6495
|
+
type: description.type,
|
|
6496
|
+
sdp: addIcesInAllBundles(sdp),
|
|
6497
|
+
};
|
|
6331
6498
|
}
|
|
6332
6499
|
|
|
6333
6500
|
wazoLogger.info('No ICE candidates found in SDP, fixing it with gathered ices', this.gatheredCandidates);
|
|
@@ -7787,41 +7954,58 @@ class WebRTCClient extends Emitter {
|
|
|
7787
7954
|
});
|
|
7788
7955
|
}
|
|
7789
7956
|
|
|
7790
|
-
changeAudioInputDevice(id , session ) {
|
|
7957
|
+
async changeAudioInputDevice(id , session , force ) {
|
|
7791
7958
|
const currentId = this.getAudioDeviceId();
|
|
7792
7959
|
logger$8.info('setting audio input device', { id, currentId, session: !!session });
|
|
7793
7960
|
|
|
7794
|
-
if (id === currentId) {
|
|
7961
|
+
if (!force && id === currentId) {
|
|
7795
7962
|
return null;
|
|
7796
7963
|
}
|
|
7797
7964
|
|
|
7965
|
+
// in order to handle an audio track change for default devices
|
|
7966
|
+
// we need the actual id of the device (not 'default')
|
|
7967
|
+
let deviceId = id;
|
|
7968
|
+
if (id === 'default' && navigator.mediaDevices) {
|
|
7969
|
+
const devices = await navigator.mediaDevices.enumerateDevices();
|
|
7970
|
+
const defaultDevice = devices.find(device => device.deviceId === 'default');
|
|
7971
|
+
if (defaultDevice) {
|
|
7972
|
+
const deviceLabel = defaultDevice.label.replace('Default - ', '');
|
|
7973
|
+
const targetDevice = devices.find(device => device.label === deviceLabel);
|
|
7974
|
+
if (targetDevice) {
|
|
7975
|
+
deviceId = targetDevice.deviceId;
|
|
7976
|
+
if (!force && deviceId === currentId) {
|
|
7977
|
+
return null;
|
|
7978
|
+
}
|
|
7979
|
+
}
|
|
7980
|
+
}
|
|
7981
|
+
}
|
|
7982
|
+
|
|
7798
7983
|
// let's update the local audio value
|
|
7799
7984
|
if (this.audio) {
|
|
7800
7985
|
this.audio = {
|
|
7801
7986
|
deviceId: {
|
|
7802
|
-
exact:
|
|
7987
|
+
exact: deviceId,
|
|
7803
7988
|
},
|
|
7804
7989
|
};
|
|
7805
7990
|
}
|
|
7806
7991
|
|
|
7807
|
-
if (session) {
|
|
7992
|
+
if (session && navigator.mediaDevices) {
|
|
7808
7993
|
const sdh = session.sessionDescriptionHandler;
|
|
7809
7994
|
const pc = sdh.peerConnection;
|
|
7810
7995
|
|
|
7811
|
-
|
|
7812
|
-
|
|
7813
|
-
|
|
7814
|
-
|
|
7996
|
+
const constraints = { audio: { deviceId: { exact: deviceId } } };
|
|
7997
|
+
const stream = await navigator.mediaDevices.getUserMedia(constraints);
|
|
7998
|
+
const audioTrack = stream.getAudioTracks()[0];
|
|
7999
|
+
const sender = pc && pc.getSenders().find(s => audioTrack && s && s.track && s.track.kind === audioTrack.kind);
|
|
7815
8000
|
|
|
7816
|
-
|
|
7817
|
-
|
|
7818
|
-
|
|
7819
|
-
}
|
|
7820
|
-
sender.replaceTrack(audioTrack);
|
|
8001
|
+
if (sender) {
|
|
8002
|
+
if (sender.track) {
|
|
8003
|
+
audioTrack.enabled = sender.track.enabled;
|
|
7821
8004
|
}
|
|
8005
|
+
sender.replaceTrack(audioTrack);
|
|
8006
|
+
}
|
|
7822
8007
|
|
|
7823
|
-
|
|
7824
|
-
});
|
|
8008
|
+
return stream;
|
|
7825
8009
|
}
|
|
7826
8010
|
}
|
|
7827
8011
|
|
|
@@ -7841,14 +8025,14 @@ class WebRTCClient extends Emitter {
|
|
|
7841
8025
|
return null;
|
|
7842
8026
|
}
|
|
7843
8027
|
|
|
7844
|
-
// let's
|
|
7845
|
-
|
|
7846
|
-
|
|
7847
|
-
|
|
7848
|
-
|
|
7849
|
-
|
|
7850
|
-
}
|
|
7851
|
-
}
|
|
8028
|
+
// let's make sure we don't lose other video constraints settings -- width, height, frameRate...
|
|
8029
|
+
const videoObject = typeof this.video === 'object' ? this.video : {};
|
|
8030
|
+
this.video = {
|
|
8031
|
+
...videoObject,
|
|
8032
|
+
deviceId: {
|
|
8033
|
+
exact: id,
|
|
8034
|
+
},
|
|
8035
|
+
};
|
|
7852
8036
|
}
|
|
7853
8037
|
|
|
7854
8038
|
changeSessionVideoInputDevice(id , session ) {
|
|
@@ -9587,10 +9771,10 @@ class WebRTCPhone extends Emitter {
|
|
|
9587
9771
|
this.audioRingVolume = volume;
|
|
9588
9772
|
}
|
|
9589
9773
|
|
|
9590
|
-
changeAudioInputDevice(id ) {
|
|
9774
|
+
changeAudioInputDevice(id , force ) {
|
|
9591
9775
|
logger$7.info('WebRTC phone - changeAudio input device', { deviceId: id });
|
|
9592
9776
|
|
|
9593
|
-
return this.client.changeAudioInputDevice(id, this.currentSipSession);
|
|
9777
|
+
return this.client.changeAudioInputDevice(id, this.currentSipSession, force);
|
|
9594
9778
|
}
|
|
9595
9779
|
|
|
9596
9780
|
changeVideoInputDevice(id ) {
|
|
@@ -11243,6 +11427,7 @@ const AGENT_UNPAUSED = 'agent_unpaused';
|
|
|
11243
11427
|
const CONFERENCE_ADHOC_PARTICIPANT_LEFT = 'conference_adhoc_participant_left';
|
|
11244
11428
|
const CONFERENCE_ADHOC_DELETED = 'conference_adhoc_deleted';
|
|
11245
11429
|
const MEETING_USER_PROGRESS = 'meeting_user_progress';
|
|
11430
|
+
const MEETING_USER_GUEST_AUTHORIZATION_CREATED = 'meeting_user_guest_authorization_created';
|
|
11246
11431
|
|
|
11247
11432
|
const BLACKLIST_EVENTS = [
|
|
11248
11433
|
CHAT_MESSAGE_SENT,
|
|
@@ -11594,6 +11779,7 @@ WebSocketClient.eventLists = [
|
|
|
11594
11779
|
CONFERENCE_ADHOC_PARTICIPANT_LEFT,
|
|
11595
11780
|
CONFERENCE_ADHOC_DELETED,
|
|
11596
11781
|
MEETING_USER_PROGRESS,
|
|
11782
|
+
MEETING_USER_GUEST_AUTHORIZATION_CREATED,
|
|
11597
11783
|
];
|
|
11598
11784
|
|
|
11599
11785
|
var WebSocketClient$1 = /*#__PURE__*/Object.freeze({
|
|
@@ -11665,6 +11851,7 @@ var WebSocketClient$1 = /*#__PURE__*/Object.freeze({
|
|
|
11665
11851
|
CONFERENCE_ADHOC_PARTICIPANT_LEFT: CONFERENCE_ADHOC_PARTICIPANT_LEFT,
|
|
11666
11852
|
CONFERENCE_ADHOC_DELETED: CONFERENCE_ADHOC_DELETED,
|
|
11667
11853
|
MEETING_USER_PROGRESS: MEETING_USER_PROGRESS,
|
|
11854
|
+
MEETING_USER_GUEST_AUTHORIZATION_CREATED: MEETING_USER_GUEST_AUTHORIZATION_CREATED,
|
|
11668
11855
|
HEARTBEAT_ENGINE_VERSION: HEARTBEAT_ENGINE_VERSION,
|
|
11669
11856
|
'default': WebSocketClient
|
|
11670
11857
|
});
|
|
@@ -11762,7 +11949,7 @@ class SipRoom extends Room {
|
|
|
11762
11949
|
logger$3.info('connecting to sip room', { extension, audioOnly, room: !!room });
|
|
11763
11950
|
|
|
11764
11951
|
if (!room) {
|
|
11765
|
-
await Wazo.Phone.connect();
|
|
11952
|
+
await Wazo.Phone.connect({ media: constraints });
|
|
11766
11953
|
|
|
11767
11954
|
const withCamera = constraints && !!constraints.video;
|
|
11768
11955
|
|
|
@@ -13449,7 +13636,7 @@ class Room extends Emitter {
|
|
|
13449
13636
|
logger$1.info('connecting to room', { extension, audioOnly, room: !!room });
|
|
13450
13637
|
|
|
13451
13638
|
if (!room) {
|
|
13452
|
-
await Wazo.Phone.connect();
|
|
13639
|
+
await Wazo.Phone.connect({ media: constraints });
|
|
13453
13640
|
|
|
13454
13641
|
const withCamera = constraints && !!constraints.video;
|
|
13455
13642
|
|
|
@@ -13894,7 +14081,7 @@ class Room extends Emitter {
|
|
|
13894
14081
|
const participant = this._getParticipantFromCallId(status.callId);
|
|
13895
14082
|
|
|
13896
14083
|
if (participant) {
|
|
13897
|
-
// we're
|
|
14084
|
+
// we're receiving, so no need to broadcast
|
|
13898
14085
|
participant.updateStatus(status, false);
|
|
13899
14086
|
}
|
|
13900
14087
|
break;
|
|
@@ -14168,6 +14355,7 @@ class Participant extends Emitter {
|
|
|
14168
14355
|
|
|
14169
14356
|
|
|
14170
14357
|
|
|
14358
|
+
|
|
14171
14359
|
|
|
14172
14360
|
|
|
14173
14361
|
|
|
@@ -14185,6 +14373,7 @@ class Participant extends Emitter {
|
|
|
14185
14373
|
|
|
14186
14374
|
|
|
14187
14375
|
|
|
14376
|
+
|
|
14188
14377
|
|
|
14189
14378
|
/**
|
|
14190
14379
|
* @param room Room The room where the participant is
|
|
@@ -14208,6 +14397,7 @@ class Participant extends Emitter {
|
|
|
14208
14397
|
this.screensharing = false;
|
|
14209
14398
|
this.isOnHold = false;
|
|
14210
14399
|
this.extra = extra;
|
|
14400
|
+
this.banned = false;
|
|
14211
14401
|
|
|
14212
14402
|
this.ON_UPDATED = 'participant/ON_UPDATED';
|
|
14213
14403
|
this.ON_START_TALKING = 'participant/ON_START_TALKING';
|
|
@@ -14224,6 +14414,7 @@ class Participant extends Emitter {
|
|
|
14224
14414
|
this.ON_EXTRA_CHANGE = 'participant/ON_EXTRA_CHANGE';
|
|
14225
14415
|
this.ON_HOLD = 'participant/ON_HOLD';
|
|
14226
14416
|
this.ON_RESUME = 'participant/ON_RESUME';
|
|
14417
|
+
this.ON_BAN = 'participant/ON_BAN';
|
|
14227
14418
|
}
|
|
14228
14419
|
|
|
14229
14420
|
triggerEvent(name , ...args ) {
|
|
@@ -14264,6 +14455,10 @@ class Participant extends Emitter {
|
|
|
14264
14455
|
status.extra = this.extra;
|
|
14265
14456
|
break;
|
|
14266
14457
|
}
|
|
14458
|
+
case this.ON_BAN: {
|
|
14459
|
+
status.banned = true;
|
|
14460
|
+
break;
|
|
14461
|
+
}
|
|
14267
14462
|
}
|
|
14268
14463
|
|
|
14269
14464
|
if (broadcast) {
|
|
@@ -14366,6 +14561,11 @@ class Participant extends Emitter {
|
|
|
14366
14561
|
this.triggerUpdate(this.ON_RESUME, broadcast);
|
|
14367
14562
|
}
|
|
14368
14563
|
|
|
14564
|
+
onBan(broadcast = true) {
|
|
14565
|
+
this.banned = true;
|
|
14566
|
+
this.triggerUpdate(this.ON_BAN, broadcast);
|
|
14567
|
+
}
|
|
14568
|
+
|
|
14369
14569
|
getStatus() {
|
|
14370
14570
|
return {
|
|
14371
14571
|
callId: this.callId,
|
|
@@ -14412,6 +14612,10 @@ class Participant extends Emitter {
|
|
|
14412
14612
|
}
|
|
14413
14613
|
}
|
|
14414
14614
|
|
|
14615
|
+
if (status.banned) {
|
|
14616
|
+
this.onBan(false);
|
|
14617
|
+
}
|
|
14618
|
+
|
|
14415
14619
|
// Poor man's object comparison
|
|
14416
14620
|
if (typeof status.extra !== 'undefined' && JSON.stringify(this.extra) !== JSON.stringify(status.extra)) {
|
|
14417
14621
|
this.extra = { ...this.extra, ...status.extra };
|
|
@@ -14439,6 +14643,28 @@ class Participant extends Emitter {
|
|
|
14439
14643
|
this.streams = streams;
|
|
14440
14644
|
this.videoStreams = streams;
|
|
14441
14645
|
}
|
|
14646
|
+
|
|
14647
|
+
async ban(apiRequestDelay = null) {
|
|
14648
|
+
const { meetingUuid } = this.room;
|
|
14649
|
+
if (!meetingUuid) {
|
|
14650
|
+
throw new Error('Attempting to ban a participant without a `meetingUuid`');
|
|
14651
|
+
}
|
|
14652
|
+
|
|
14653
|
+
// this notifies all that someone is being banned
|
|
14654
|
+
this.onBan(true);
|
|
14655
|
+
|
|
14656
|
+
// this allows to delay the actual ban, in order for the banned participant as well as others to react to the situation
|
|
14657
|
+
if (apiRequestDelay) {
|
|
14658
|
+
await this.delay(apiRequestDelay);
|
|
14659
|
+
}
|
|
14660
|
+
|
|
14661
|
+
// proceed with the actual kick
|
|
14662
|
+
return getApiClient().calld.banMeetingParticipant(meetingUuid, this.callId);
|
|
14663
|
+
}
|
|
14664
|
+
|
|
14665
|
+
async delay(ms ) {
|
|
14666
|
+
return new Promise(resolve => setTimeout(resolve, ms));
|
|
14667
|
+
}
|
|
14442
14668
|
}
|
|
14443
14669
|
|
|
14444
14670
|
export default Participant;
|