@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 ) =>
|
|
@@ -5907,6 +6053,24 @@ const fixSdp = (sdp , candidates , forcePort = true)
|
|
|
5907
6053
|
return fixed;
|
|
5908
6054
|
};
|
|
5909
6055
|
|
|
6056
|
+
const addIcesInAllBundles = (sdp ) => {
|
|
6057
|
+
const parsedSdp = sdpParser__default['default'].parse(sdp);
|
|
6058
|
+
|
|
6059
|
+
const mediaWithCandidate = parsedSdp.media.find(media => !!media.candidates);
|
|
6060
|
+
if (!mediaWithCandidate) {
|
|
6061
|
+
return sdp;
|
|
6062
|
+
}
|
|
6063
|
+
|
|
6064
|
+
const { candidates } = mediaWithCandidate;
|
|
6065
|
+
|
|
6066
|
+
parsedSdp.media = parsedSdp.media.map(media => ({
|
|
6067
|
+
...media,
|
|
6068
|
+
candidates: media.candidates || candidates,
|
|
6069
|
+
}));
|
|
6070
|
+
|
|
6071
|
+
return sdpParser__default['default'].write(parsedSdp);
|
|
6072
|
+
};
|
|
6073
|
+
|
|
5910
6074
|
/* global RTCSessionDescriptionInit, navigator */
|
|
5911
6075
|
|
|
5912
6076
|
const wazoLogger = IssueReporter$1 ? IssueReporter$1.loggerFor('webrtc-sdh') : console;
|
|
@@ -6036,7 +6200,10 @@ class WazoSessionDescriptionHandler extends sessionDescriptionHandler.SessionDes
|
|
|
6036
6200
|
|
|
6037
6201
|
// Check if we got ICEs
|
|
6038
6202
|
if (sdp.indexOf('a=candidate') !== -1) {
|
|
6039
|
-
return
|
|
6203
|
+
return {
|
|
6204
|
+
type: description.type,
|
|
6205
|
+
sdp: addIcesInAllBundles(sdp),
|
|
6206
|
+
};
|
|
6040
6207
|
}
|
|
6041
6208
|
|
|
6042
6209
|
wazoLogger.info('No ICE candidates found in SDP, fixing it with gathered ices', this.gatheredCandidates);
|
|
@@ -7496,41 +7663,58 @@ class WebRTCClient extends Emitter {
|
|
|
7496
7663
|
});
|
|
7497
7664
|
}
|
|
7498
7665
|
|
|
7499
|
-
changeAudioInputDevice(id , session ) {
|
|
7666
|
+
async changeAudioInputDevice(id , session , force ) {
|
|
7500
7667
|
const currentId = this.getAudioDeviceId();
|
|
7501
7668
|
logger$9.info('setting audio input device', { id, currentId, session: !!session });
|
|
7502
7669
|
|
|
7503
|
-
if (id === currentId) {
|
|
7670
|
+
if (!force && id === currentId) {
|
|
7504
7671
|
return null;
|
|
7505
7672
|
}
|
|
7506
7673
|
|
|
7674
|
+
// in order to handle an audio track change for default devices
|
|
7675
|
+
// we need the actual id of the device (not 'default')
|
|
7676
|
+
let deviceId = id;
|
|
7677
|
+
if (id === 'default' && navigator.mediaDevices) {
|
|
7678
|
+
const devices = await navigator.mediaDevices.enumerateDevices();
|
|
7679
|
+
const defaultDevice = devices.find(device => device.deviceId === 'default');
|
|
7680
|
+
if (defaultDevice) {
|
|
7681
|
+
const deviceLabel = defaultDevice.label.replace('Default - ', '');
|
|
7682
|
+
const targetDevice = devices.find(device => device.label === deviceLabel);
|
|
7683
|
+
if (targetDevice) {
|
|
7684
|
+
deviceId = targetDevice.deviceId;
|
|
7685
|
+
if (!force && deviceId === currentId) {
|
|
7686
|
+
return null;
|
|
7687
|
+
}
|
|
7688
|
+
}
|
|
7689
|
+
}
|
|
7690
|
+
}
|
|
7691
|
+
|
|
7507
7692
|
// let's update the local audio value
|
|
7508
7693
|
if (this.audio) {
|
|
7509
7694
|
this.audio = {
|
|
7510
7695
|
deviceId: {
|
|
7511
|
-
exact:
|
|
7696
|
+
exact: deviceId,
|
|
7512
7697
|
},
|
|
7513
7698
|
};
|
|
7514
7699
|
}
|
|
7515
7700
|
|
|
7516
|
-
if (session) {
|
|
7701
|
+
if (session && navigator.mediaDevices) {
|
|
7517
7702
|
const sdh = session.sessionDescriptionHandler;
|
|
7518
7703
|
const pc = sdh.peerConnection;
|
|
7519
7704
|
|
|
7520
|
-
|
|
7521
|
-
|
|
7522
|
-
|
|
7523
|
-
|
|
7705
|
+
const constraints = { audio: { deviceId: { exact: deviceId } } };
|
|
7706
|
+
const stream = await navigator.mediaDevices.getUserMedia(constraints);
|
|
7707
|
+
const audioTrack = stream.getAudioTracks()[0];
|
|
7708
|
+
const sender = pc && pc.getSenders().find(s => audioTrack && s && s.track && s.track.kind === audioTrack.kind);
|
|
7524
7709
|
|
|
7525
|
-
|
|
7526
|
-
|
|
7527
|
-
|
|
7528
|
-
}
|
|
7529
|
-
sender.replaceTrack(audioTrack);
|
|
7710
|
+
if (sender) {
|
|
7711
|
+
if (sender.track) {
|
|
7712
|
+
audioTrack.enabled = sender.track.enabled;
|
|
7530
7713
|
}
|
|
7714
|
+
sender.replaceTrack(audioTrack);
|
|
7715
|
+
}
|
|
7531
7716
|
|
|
7532
|
-
|
|
7533
|
-
});
|
|
7717
|
+
return stream;
|
|
7534
7718
|
}
|
|
7535
7719
|
}
|
|
7536
7720
|
|
|
@@ -7550,14 +7734,14 @@ class WebRTCClient extends Emitter {
|
|
|
7550
7734
|
return null;
|
|
7551
7735
|
}
|
|
7552
7736
|
|
|
7553
|
-
// let's
|
|
7554
|
-
|
|
7555
|
-
|
|
7556
|
-
|
|
7557
|
-
|
|
7558
|
-
|
|
7559
|
-
}
|
|
7560
|
-
}
|
|
7737
|
+
// let's make sure we don't lose other video constraints settings -- width, height, frameRate...
|
|
7738
|
+
const videoObject = typeof this.video === 'object' ? this.video : {};
|
|
7739
|
+
this.video = {
|
|
7740
|
+
...videoObject,
|
|
7741
|
+
deviceId: {
|
|
7742
|
+
exact: id,
|
|
7743
|
+
},
|
|
7744
|
+
};
|
|
7561
7745
|
}
|
|
7562
7746
|
|
|
7563
7747
|
changeSessionVideoInputDevice(id , session ) {
|
|
@@ -9296,10 +9480,10 @@ class WebRTCPhone extends Emitter {
|
|
|
9296
9480
|
this.audioRingVolume = volume;
|
|
9297
9481
|
}
|
|
9298
9482
|
|
|
9299
|
-
changeAudioInputDevice(id ) {
|
|
9483
|
+
changeAudioInputDevice(id , force ) {
|
|
9300
9484
|
logger$8.info('WebRTC phone - changeAudio input device', { deviceId: id });
|
|
9301
9485
|
|
|
9302
|
-
return this.client.changeAudioInputDevice(id, this.currentSipSession);
|
|
9486
|
+
return this.client.changeAudioInputDevice(id, this.currentSipSession, force);
|
|
9303
9487
|
}
|
|
9304
9488
|
|
|
9305
9489
|
changeVideoInputDevice(id ) {
|
|
@@ -10952,6 +11136,7 @@ const AGENT_UNPAUSED = 'agent_unpaused';
|
|
|
10952
11136
|
const CONFERENCE_ADHOC_PARTICIPANT_LEFT = 'conference_adhoc_participant_left';
|
|
10953
11137
|
const CONFERENCE_ADHOC_DELETED = 'conference_adhoc_deleted';
|
|
10954
11138
|
const MEETING_USER_PROGRESS = 'meeting_user_progress';
|
|
11139
|
+
const MEETING_USER_GUEST_AUTHORIZATION_CREATED = 'meeting_user_guest_authorization_created';
|
|
10955
11140
|
|
|
10956
11141
|
const BLACKLIST_EVENTS = [
|
|
10957
11142
|
CHAT_MESSAGE_SENT,
|
|
@@ -11303,6 +11488,7 @@ WebSocketClient.eventLists = [
|
|
|
11303
11488
|
CONFERENCE_ADHOC_PARTICIPANT_LEFT,
|
|
11304
11489
|
CONFERENCE_ADHOC_DELETED,
|
|
11305
11490
|
MEETING_USER_PROGRESS,
|
|
11491
|
+
MEETING_USER_GUEST_AUTHORIZATION_CREATED,
|
|
11306
11492
|
];
|
|
11307
11493
|
|
|
11308
11494
|
var WebSocketClient$1 = /*#__PURE__*/Object.freeze({
|
|
@@ -11374,6 +11560,7 @@ var WebSocketClient$1 = /*#__PURE__*/Object.freeze({
|
|
|
11374
11560
|
CONFERENCE_ADHOC_PARTICIPANT_LEFT: CONFERENCE_ADHOC_PARTICIPANT_LEFT,
|
|
11375
11561
|
CONFERENCE_ADHOC_DELETED: CONFERENCE_ADHOC_DELETED,
|
|
11376
11562
|
MEETING_USER_PROGRESS: MEETING_USER_PROGRESS,
|
|
11563
|
+
MEETING_USER_GUEST_AUTHORIZATION_CREATED: MEETING_USER_GUEST_AUTHORIZATION_CREATED,
|
|
11377
11564
|
HEARTBEAT_ENGINE_VERSION: HEARTBEAT_ENGINE_VERSION,
|
|
11378
11565
|
'default': WebSocketClient
|
|
11379
11566
|
});
|
|
@@ -11478,6 +11665,7 @@ class Participant extends Emitter {
|
|
|
11478
11665
|
|
|
11479
11666
|
|
|
11480
11667
|
|
|
11668
|
+
|
|
11481
11669
|
|
|
11482
11670
|
|
|
11483
11671
|
|
|
@@ -11495,6 +11683,7 @@ class Participant extends Emitter {
|
|
|
11495
11683
|
|
|
11496
11684
|
|
|
11497
11685
|
|
|
11686
|
+
|
|
11498
11687
|
|
|
11499
11688
|
/**
|
|
11500
11689
|
* @param room Room The room where the participant is
|
|
@@ -11518,6 +11707,7 @@ class Participant extends Emitter {
|
|
|
11518
11707
|
this.screensharing = false;
|
|
11519
11708
|
this.isOnHold = false;
|
|
11520
11709
|
this.extra = extra;
|
|
11710
|
+
this.banned = false;
|
|
11521
11711
|
|
|
11522
11712
|
this.ON_UPDATED = 'participant/ON_UPDATED';
|
|
11523
11713
|
this.ON_START_TALKING = 'participant/ON_START_TALKING';
|
|
@@ -11534,6 +11724,7 @@ class Participant extends Emitter {
|
|
|
11534
11724
|
this.ON_EXTRA_CHANGE = 'participant/ON_EXTRA_CHANGE';
|
|
11535
11725
|
this.ON_HOLD = 'participant/ON_HOLD';
|
|
11536
11726
|
this.ON_RESUME = 'participant/ON_RESUME';
|
|
11727
|
+
this.ON_BAN = 'participant/ON_BAN';
|
|
11537
11728
|
}
|
|
11538
11729
|
|
|
11539
11730
|
triggerEvent(name , ...args ) {
|
|
@@ -11574,6 +11765,10 @@ class Participant extends Emitter {
|
|
|
11574
11765
|
status.extra = this.extra;
|
|
11575
11766
|
break;
|
|
11576
11767
|
}
|
|
11768
|
+
case this.ON_BAN: {
|
|
11769
|
+
status.banned = true;
|
|
11770
|
+
break;
|
|
11771
|
+
}
|
|
11577
11772
|
}
|
|
11578
11773
|
|
|
11579
11774
|
if (broadcast) {
|
|
@@ -11676,6 +11871,11 @@ class Participant extends Emitter {
|
|
|
11676
11871
|
this.triggerUpdate(this.ON_RESUME, broadcast);
|
|
11677
11872
|
}
|
|
11678
11873
|
|
|
11874
|
+
onBan(broadcast = true) {
|
|
11875
|
+
this.banned = true;
|
|
11876
|
+
this.triggerUpdate(this.ON_BAN, broadcast);
|
|
11877
|
+
}
|
|
11878
|
+
|
|
11679
11879
|
getStatus() {
|
|
11680
11880
|
return {
|
|
11681
11881
|
callId: this.callId,
|
|
@@ -11722,6 +11922,10 @@ class Participant extends Emitter {
|
|
|
11722
11922
|
}
|
|
11723
11923
|
}
|
|
11724
11924
|
|
|
11925
|
+
if (status.banned) {
|
|
11926
|
+
this.onBan(false);
|
|
11927
|
+
}
|
|
11928
|
+
|
|
11725
11929
|
// Poor man's object comparison
|
|
11726
11930
|
if (typeof status.extra !== 'undefined' && JSON.stringify(this.extra) !== JSON.stringify(status.extra)) {
|
|
11727
11931
|
this.extra = { ...this.extra, ...status.extra };
|
|
@@ -11749,6 +11953,28 @@ class Participant extends Emitter {
|
|
|
11749
11953
|
this.streams = streams;
|
|
11750
11954
|
this.videoStreams = streams;
|
|
11751
11955
|
}
|
|
11956
|
+
|
|
11957
|
+
async ban(apiRequestDelay = null) {
|
|
11958
|
+
const { meetingUuid } = this.room;
|
|
11959
|
+
if (!meetingUuid) {
|
|
11960
|
+
throw new Error('Attempting to ban a participant without a `meetingUuid`');
|
|
11961
|
+
}
|
|
11962
|
+
|
|
11963
|
+
// this notifies all that someone is being banned
|
|
11964
|
+
this.onBan(true);
|
|
11965
|
+
|
|
11966
|
+
// this allows to delay the actual ban, in order for the banned participant as well as others to react to the situation
|
|
11967
|
+
if (apiRequestDelay) {
|
|
11968
|
+
await this.delay(apiRequestDelay);
|
|
11969
|
+
}
|
|
11970
|
+
|
|
11971
|
+
// proceed with the actual kick
|
|
11972
|
+
return getApiClient().calld.banMeetingParticipant(meetingUuid, this.callId);
|
|
11973
|
+
}
|
|
11974
|
+
|
|
11975
|
+
async delay(ms ) {
|
|
11976
|
+
return new Promise(resolve => setTimeout(resolve, ms));
|
|
11977
|
+
}
|
|
11752
11978
|
}
|
|
11753
11979
|
|
|
11754
11980
|
//
|
|
@@ -11901,7 +12127,7 @@ class Room$1 extends Emitter {
|
|
|
11901
12127
|
logger$3.info('connecting to room', { extension, audioOnly, room: !!room });
|
|
11902
12128
|
|
|
11903
12129
|
if (!room) {
|
|
11904
|
-
await Wazo.Phone.connect();
|
|
12130
|
+
await Wazo.Phone.connect({ media: constraints });
|
|
11905
12131
|
|
|
11906
12132
|
const withCamera = constraints && !!constraints.video;
|
|
11907
12133
|
|
|
@@ -12346,7 +12572,7 @@ class Room$1 extends Emitter {
|
|
|
12346
12572
|
const participant = this._getParticipantFromCallId(status.callId);
|
|
12347
12573
|
|
|
12348
12574
|
if (participant) {
|
|
12349
|
-
// we're
|
|
12575
|
+
// we're receiving, so no need to broadcast
|
|
12350
12576
|
participant.updateStatus(status, false);
|
|
12351
12577
|
}
|
|
12352
12578
|
break;
|
|
@@ -12613,7 +12839,7 @@ class SipRoom extends Room$1 {
|
|
|
12613
12839
|
logger$2.info('connecting to sip room', { extension, audioOnly, room: !!room });
|
|
12614
12840
|
|
|
12615
12841
|
if (!room) {
|
|
12616
|
-
await Wazo.Phone.connect();
|
|
12842
|
+
await Wazo.Phone.connect({ media: constraints });
|
|
12617
12843
|
|
|
12618
12844
|
const withCamera = constraints && !!constraints.video;
|
|
12619
12845
|
|