@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
|
@@ -2655,6 +2655,70 @@ class ExternalApp {
|
|
|
2655
2655
|
|
|
2656
2656
|
//
|
|
2657
2657
|
|
|
2658
|
+
class MeetingAuthorization {
|
|
2659
|
+
|
|
2660
|
+
|
|
2661
|
+
|
|
2662
|
+
|
|
2663
|
+
|
|
2664
|
+
|
|
2665
|
+
constructor({
|
|
2666
|
+
meetingUuid,
|
|
2667
|
+
uuid,
|
|
2668
|
+
userUuid,
|
|
2669
|
+
userName,
|
|
2670
|
+
} = {}) {
|
|
2671
|
+
this.meetingUuid = meetingUuid;
|
|
2672
|
+
this.uuid = uuid;
|
|
2673
|
+
this.userUuid = userUuid;
|
|
2674
|
+
this.userName = userName;
|
|
2675
|
+
}
|
|
2676
|
+
|
|
2677
|
+
setStatus(status ) {
|
|
2678
|
+
this.status = status;
|
|
2679
|
+
}
|
|
2680
|
+
|
|
2681
|
+
getStatus() {
|
|
2682
|
+
return this.status;
|
|
2683
|
+
}
|
|
2684
|
+
|
|
2685
|
+
static parse(plain ) {
|
|
2686
|
+
const {
|
|
2687
|
+
meeting_uuid: meetingUuid,
|
|
2688
|
+
uuid,
|
|
2689
|
+
guest_uuid: userUuid,
|
|
2690
|
+
guest_name: userName,
|
|
2691
|
+
} = plain;
|
|
2692
|
+
|
|
2693
|
+
return new MeetingAuthorization({
|
|
2694
|
+
meetingUuid,
|
|
2695
|
+
uuid,
|
|
2696
|
+
userUuid,
|
|
2697
|
+
userName,
|
|
2698
|
+
});
|
|
2699
|
+
}
|
|
2700
|
+
|
|
2701
|
+
static parseMany(items ) {
|
|
2702
|
+
if (!items) {
|
|
2703
|
+
return [];
|
|
2704
|
+
}
|
|
2705
|
+
return items.map(MeetingAuthorization.parse);
|
|
2706
|
+
}
|
|
2707
|
+
}
|
|
2708
|
+
|
|
2709
|
+
//
|
|
2710
|
+
|
|
2711
|
+
|
|
2712
|
+
|
|
2713
|
+
|
|
2714
|
+
|
|
2715
|
+
|
|
2716
|
+
|
|
2717
|
+
|
|
2718
|
+
|
|
2719
|
+
|
|
2720
|
+
|
|
2721
|
+
|
|
2658
2722
|
|
|
2659
2723
|
|
|
2660
2724
|
|
|
@@ -2665,6 +2729,7 @@ class ExternalApp {
|
|
|
2665
2729
|
|
|
2666
2730
|
|
|
2667
2731
|
|
|
2732
|
+
|
|
2668
2733
|
|
|
2669
2734
|
|
|
2670
2735
|
class Meeting {
|
|
@@ -2679,6 +2744,8 @@ class Meeting {
|
|
|
2679
2744
|
|
|
2680
2745
|
|
|
2681
2746
|
|
|
2747
|
+
|
|
2748
|
+
|
|
2682
2749
|
|
|
2683
2750
|
static parse(plain ) {
|
|
2684
2751
|
return new Meeting({
|
|
@@ -2691,6 +2758,7 @@ class Meeting {
|
|
|
2691
2758
|
extension: plain.exten,
|
|
2692
2759
|
persistent: plain.persistent,
|
|
2693
2760
|
creationTime: moment__default['default'](plain.creation_time).toDate(),
|
|
2761
|
+
requireAuthorization: plain.require_authorization,
|
|
2694
2762
|
});
|
|
2695
2763
|
}
|
|
2696
2764
|
|
|
@@ -2715,6 +2783,7 @@ class Meeting {
|
|
|
2715
2783
|
extension,
|
|
2716
2784
|
persistent,
|
|
2717
2785
|
creationTime,
|
|
2786
|
+
requireAuthorization,
|
|
2718
2787
|
} = {}) {
|
|
2719
2788
|
this.guestSipAuthorization = guestSipAuthorization;
|
|
2720
2789
|
this.uri = uri;
|
|
@@ -2725,6 +2794,7 @@ class Meeting {
|
|
|
2725
2794
|
this.extension = extension;
|
|
2726
2795
|
this.persistent = persistent;
|
|
2727
2796
|
this.creationTime = creationTime;
|
|
2797
|
+
this.requireAuthorization = requireAuthorization;
|
|
2728
2798
|
|
|
2729
2799
|
// Useful to compare instead of instanceof with minified code
|
|
2730
2800
|
this.type = 'Meeting';
|
|
@@ -2735,8 +2805,32 @@ class Meeting {
|
|
|
2735
2805
|
const [username, secret] = atob(this.guestSipAuthorization).split(':');
|
|
2736
2806
|
return { username, secret };
|
|
2737
2807
|
}
|
|
2808
|
+
|
|
2738
2809
|
}
|
|
2739
2810
|
|
|
2811
|
+
//
|
|
2812
|
+
|
|
2813
|
+
const camelToUnderscore = (key ) => {
|
|
2814
|
+
if (typeof key !== 'string') {
|
|
2815
|
+
throw new Error('Input is not a string');
|
|
2816
|
+
}
|
|
2817
|
+
return key.charAt(0).toLowerCase() + key.substring(1).replace(/([A-Z])/g, '_$1').toLowerCase();
|
|
2818
|
+
};
|
|
2819
|
+
|
|
2820
|
+
//
|
|
2821
|
+
|
|
2822
|
+
const convertKeysFromCamelToUnderscore = (args ) => {
|
|
2823
|
+
if (!args || typeof args !== 'object' || Array.isArray(args)) {
|
|
2824
|
+
throw new Error('Input is not an object');
|
|
2825
|
+
}
|
|
2826
|
+
|
|
2827
|
+
return Object.keys(args).reduce((acc, key) => {
|
|
2828
|
+
acc[camelToUnderscore(key)] = typeof args[key] === 'object' && !Array.isArray(args[key])
|
|
2829
|
+
? convertKeysFromCamelToUnderscore(args[key]) : args[key];
|
|
2830
|
+
return acc;
|
|
2831
|
+
}, {});
|
|
2832
|
+
};
|
|
2833
|
+
|
|
2740
2834
|
/* */
|
|
2741
2835
|
|
|
2742
2836
|
var confdMethods = (client , baseUrl ) => ({
|
|
@@ -2805,8 +2899,18 @@ var confdMethods = (client , baseUrl ) => ({
|
|
|
2805
2899
|
getMyMeetings: () =>
|
|
2806
2900
|
client.get(`${baseUrl}/users/me/meetings`).then(response => Meeting.parseMany(response.items)),
|
|
2807
2901
|
|
|
2808
|
-
createMyMeeting: (
|
|
2809
|
-
client
|
|
2902
|
+
createMyMeeting: (args ) =>
|
|
2903
|
+
client
|
|
2904
|
+
.post(`${baseUrl}/users/me/meetings`, convertKeysFromCamelToUnderscore(args))
|
|
2905
|
+
.then(Meeting.parse),
|
|
2906
|
+
|
|
2907
|
+
updateMyMeeting: (meetingUuid , data ) =>
|
|
2908
|
+
client.put(
|
|
2909
|
+
`${baseUrl}/users/me/meetings/${meetingUuid}`,
|
|
2910
|
+
convertKeysFromCamelToUnderscore(data),
|
|
2911
|
+
null,
|
|
2912
|
+
ApiRequester.successResponseParser,
|
|
2913
|
+
),
|
|
2810
2914
|
|
|
2811
2915
|
deleteMyMeeting: (meetingUuid ) =>
|
|
2812
2916
|
client.delete(`${baseUrl}/users/me/meetings/${meetingUuid}`, null),
|
|
@@ -2814,8 +2918,36 @@ var confdMethods = (client , baseUrl ) => ({
|
|
|
2814
2918
|
getMeeting: (meetingUuid ) =>
|
|
2815
2919
|
client.get(`${baseUrl}/meetings/${meetingUuid}`, null).then(Meeting.parse),
|
|
2816
2920
|
|
|
2921
|
+
meetingAuthorizations: (meetingUuid ) =>
|
|
2922
|
+
client.get(`${baseUrl}/users/me/meetings/${meetingUuid}/authorizations`, null).then(MeetingAuthorization.parseMany),
|
|
2923
|
+
|
|
2924
|
+
meetingAuthorizationReject: (meetingUuid , authorizationUuid ) =>
|
|
2925
|
+
client.put(
|
|
2926
|
+
`${baseUrl}/users/me/meetings/${meetingUuid}/authorizations/${authorizationUuid}/reject`,
|
|
2927
|
+
{},
|
|
2928
|
+
null,
|
|
2929
|
+
ApiRequester.successResponseParser,
|
|
2930
|
+
),
|
|
2931
|
+
|
|
2932
|
+
meetingAuthorizationAccept: (meetingUuid , authorizationUuid ) =>
|
|
2933
|
+
client.put(
|
|
2934
|
+
`${baseUrl}/users/me/meetings/${meetingUuid}/authorizations/${authorizationUuid}/accept`,
|
|
2935
|
+
{},
|
|
2936
|
+
null,
|
|
2937
|
+
ApiRequester.successResponseParser,
|
|
2938
|
+
),
|
|
2939
|
+
|
|
2817
2940
|
guestGetMeeting: (meetingUuid ) =>
|
|
2818
2941
|
client.get(`${baseUrl}/guests/me/meetings/${meetingUuid}`, null).then(Meeting.parse),
|
|
2942
|
+
|
|
2943
|
+
guestAuthorizationRequest: (userUuid , meetingUuid , username ) =>
|
|
2944
|
+
client
|
|
2945
|
+
.post(`${baseUrl}/guests/${userUuid}/meetings/${meetingUuid}/authorizations`, { guest_name: username })
|
|
2946
|
+
.then(MeetingAuthorization.parse),
|
|
2947
|
+
|
|
2948
|
+
guestAuthorizationCheck: (userUuid , meetingUuid , authorizationUuid ) =>
|
|
2949
|
+
client.get(`${baseUrl}/guests/${userUuid}/meetings/${meetingUuid}/authorizations/${authorizationUuid}`, null),
|
|
2950
|
+
|
|
2819
2951
|
});
|
|
2820
2952
|
|
|
2821
2953
|
//
|
|
@@ -3081,6 +3213,7 @@ const RECORD_STATE_ACTIVE = 'active';
|
|
|
3081
3213
|
|
|
3082
3214
|
|
|
3083
3215
|
|
|
3216
|
+
|
|
3084
3217
|
|
|
3085
3218
|
|
|
3086
3219
|
|
|
@@ -3091,6 +3224,7 @@ const RECORD_STATE_ACTIVE = 'active';
|
|
|
3091
3224
|
|
|
3092
3225
|
|
|
3093
3226
|
|
|
3227
|
+
|
|
3094
3228
|
|
|
3095
3229
|
|
|
3096
3230
|
|
|
@@ -3119,6 +3253,7 @@ class Call {
|
|
|
3119
3253
|
|
|
3120
3254
|
|
|
3121
3255
|
|
|
3256
|
+
|
|
3122
3257
|
|
|
3123
3258
|
|
|
3124
3259
|
|
|
@@ -3143,6 +3278,7 @@ class Call {
|
|
|
3143
3278
|
calleeNumber: plain.peer_caller_id_number,
|
|
3144
3279
|
dialedExtension: plain.dialed_extension,
|
|
3145
3280
|
isCaller: plain.is_caller,
|
|
3281
|
+
isVideo: plain.is_video,
|
|
3146
3282
|
muted: plain.muted,
|
|
3147
3283
|
onHold: plain.on_hold,
|
|
3148
3284
|
status: plain.status,
|
|
@@ -3166,6 +3302,7 @@ class Call {
|
|
|
3166
3302
|
calleeNumber,
|
|
3167
3303
|
dialedExtension,
|
|
3168
3304
|
isCaller,
|
|
3305
|
+
isVideo,
|
|
3169
3306
|
lineId,
|
|
3170
3307
|
muted,
|
|
3171
3308
|
onHold,
|
|
@@ -3189,6 +3326,7 @@ class Call {
|
|
|
3189
3326
|
this.startingTime = startingTime;
|
|
3190
3327
|
this.talkingToIds = talkingToIds || [];
|
|
3191
3328
|
this.recording = recording;
|
|
3329
|
+
this.isVideo = !!isVideo;
|
|
3192
3330
|
|
|
3193
3331
|
// Useful to compare instead of instanceof with minified code
|
|
3194
3332
|
this.type = 'Call';
|
|
@@ -3662,7 +3800,7 @@ class CallSession {
|
|
|
3662
3800
|
ringing: call.isRinging(),
|
|
3663
3801
|
answered: call.isUp(),
|
|
3664
3802
|
answeredBySystem: call.isUp() && call.talkingToIds.length === 0,
|
|
3665
|
-
cameraEnabled:
|
|
3803
|
+
cameraEnabled: call.isVideo,
|
|
3666
3804
|
dialedExtension: call.dialedExtension,
|
|
3667
3805
|
call,
|
|
3668
3806
|
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
|
|
|
@@ -11918,6 +12105,7 @@ class Participant extends Emitter {
|
|
|
11918
12105
|
|
|
11919
12106
|
|
|
11920
12107
|
|
|
12108
|
+
|
|
11921
12109
|
|
|
11922
12110
|
|
|
11923
12111
|
|
|
@@ -11935,6 +12123,7 @@ class Participant extends Emitter {
|
|
|
11935
12123
|
|
|
11936
12124
|
|
|
11937
12125
|
|
|
12126
|
+
|
|
11938
12127
|
|
|
11939
12128
|
/**
|
|
11940
12129
|
* @param room Room The room where the participant is
|
|
@@ -11958,6 +12147,7 @@ class Participant extends Emitter {
|
|
|
11958
12147
|
this.screensharing = false;
|
|
11959
12148
|
this.isOnHold = false;
|
|
11960
12149
|
this.extra = extra;
|
|
12150
|
+
this.banned = false;
|
|
11961
12151
|
|
|
11962
12152
|
this.ON_UPDATED = 'participant/ON_UPDATED';
|
|
11963
12153
|
this.ON_START_TALKING = 'participant/ON_START_TALKING';
|
|
@@ -11974,6 +12164,7 @@ class Participant extends Emitter {
|
|
|
11974
12164
|
this.ON_EXTRA_CHANGE = 'participant/ON_EXTRA_CHANGE';
|
|
11975
12165
|
this.ON_HOLD = 'participant/ON_HOLD';
|
|
11976
12166
|
this.ON_RESUME = 'participant/ON_RESUME';
|
|
12167
|
+
this.ON_BAN = 'participant/ON_BAN';
|
|
11977
12168
|
}
|
|
11978
12169
|
|
|
11979
12170
|
triggerEvent(name , ...args ) {
|
|
@@ -12014,6 +12205,10 @@ class Participant extends Emitter {
|
|
|
12014
12205
|
status.extra = this.extra;
|
|
12015
12206
|
break;
|
|
12016
12207
|
}
|
|
12208
|
+
case this.ON_BAN: {
|
|
12209
|
+
status.banned = true;
|
|
12210
|
+
break;
|
|
12211
|
+
}
|
|
12017
12212
|
}
|
|
12018
12213
|
|
|
12019
12214
|
if (broadcast) {
|
|
@@ -12116,6 +12311,11 @@ class Participant extends Emitter {
|
|
|
12116
12311
|
this.triggerUpdate(this.ON_RESUME, broadcast);
|
|
12117
12312
|
}
|
|
12118
12313
|
|
|
12314
|
+
onBan(broadcast = true) {
|
|
12315
|
+
this.banned = true;
|
|
12316
|
+
this.triggerUpdate(this.ON_BAN, broadcast);
|
|
12317
|
+
}
|
|
12318
|
+
|
|
12119
12319
|
getStatus() {
|
|
12120
12320
|
return {
|
|
12121
12321
|
callId: this.callId,
|
|
@@ -12162,6 +12362,10 @@ class Participant extends Emitter {
|
|
|
12162
12362
|
}
|
|
12163
12363
|
}
|
|
12164
12364
|
|
|
12365
|
+
if (status.banned) {
|
|
12366
|
+
this.onBan(false);
|
|
12367
|
+
}
|
|
12368
|
+
|
|
12165
12369
|
// Poor man's object comparison
|
|
12166
12370
|
if (typeof status.extra !== 'undefined' && JSON.stringify(this.extra) !== JSON.stringify(status.extra)) {
|
|
12167
12371
|
this.extra = { ...this.extra, ...status.extra };
|
|
@@ -12189,6 +12393,28 @@ class Participant extends Emitter {
|
|
|
12189
12393
|
this.streams = streams;
|
|
12190
12394
|
this.videoStreams = streams;
|
|
12191
12395
|
}
|
|
12396
|
+
|
|
12397
|
+
async ban(apiRequestDelay = null) {
|
|
12398
|
+
const { meetingUuid } = this.room;
|
|
12399
|
+
if (!meetingUuid) {
|
|
12400
|
+
throw new Error('Attempting to ban a participant without a `meetingUuid`');
|
|
12401
|
+
}
|
|
12402
|
+
|
|
12403
|
+
// this notifies all that someone is being banned
|
|
12404
|
+
this.onBan(true);
|
|
12405
|
+
|
|
12406
|
+
// this allows to delay the actual ban, in order for the banned participant as well as others to react to the situation
|
|
12407
|
+
if (apiRequestDelay) {
|
|
12408
|
+
await this.delay(apiRequestDelay);
|
|
12409
|
+
}
|
|
12410
|
+
|
|
12411
|
+
// proceed with the actual kick
|
|
12412
|
+
return getApiClient().calld.banMeetingParticipant(meetingUuid, this.callId);
|
|
12413
|
+
}
|
|
12414
|
+
|
|
12415
|
+
async delay(ms ) {
|
|
12416
|
+
return new Promise(resolve => setTimeout(resolve, ms));
|
|
12417
|
+
}
|
|
12192
12418
|
}
|
|
12193
12419
|
|
|
12194
12420
|
//
|
|
@@ -13738,7 +13964,7 @@ class Room extends Emitter {
|
|
|
13738
13964
|
logger.info('connecting to room', { extension, audioOnly, room: !!room });
|
|
13739
13965
|
|
|
13740
13966
|
if (!room) {
|
|
13741
|
-
await Wazo.Phone.connect();
|
|
13967
|
+
await Wazo.Phone.connect({ media: constraints });
|
|
13742
13968
|
|
|
13743
13969
|
const withCamera = constraints && !!constraints.video;
|
|
13744
13970
|
|
|
@@ -14183,7 +14409,7 @@ class Room extends Emitter {
|
|
|
14183
14409
|
const participant = this._getParticipantFromCallId(status.callId);
|
|
14184
14410
|
|
|
14185
14411
|
if (participant) {
|
|
14186
|
-
// we're
|
|
14412
|
+
// we're receiving, so no need to broadcast
|
|
14187
14413
|
participant.updateStatus(status, false);
|
|
14188
14414
|
}
|
|
14189
14415
|
break;
|