@wazo/sdk 0.38.5 → 0.38.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/dist/wazo-sdk.js +2 -2
- package/esm/__tests__/api-client.test.js +148 -2
- package/esm/__tests__/web-rtc-client.test.js +303 -26
- package/esm/api/calld.js +14 -0
- package/esm/api/confd.js +134 -2
- package/esm/api/ctid-ng.js +6 -0
- package/esm/api-client.js +148 -2
- package/esm/checker/Checker.js +212 -26
- package/esm/checker/checks/aor.js +148 -2
- package/esm/checker/checks/api.js +148 -2
- package/esm/checker/checks/index.js +212 -26
- package/esm/checker/checks/wazo-websocket.js +2 -0
- package/esm/checker/checks/webrtc-transport.js +210 -26
- package/esm/checker/checks/webrtc.js +210 -26
- package/esm/domain/AdHocAPIConference.js +148 -2
- package/esm/domain/Call.js +6 -0
- package/esm/domain/CallSession.js +1 -1
- package/esm/domain/Features.js +148 -2
- package/esm/domain/Meeting.js +18 -0
- package/esm/domain/MeetingAuthorization.js +70 -0
- package/esm/domain/Phone/CTIPhone.js +149 -3
- package/esm/domain/Phone/WebRTCPhone.js +3 -3
- package/esm/domain/__tests__/Call.test.js +6 -0
- package/esm/domain/__tests__/CallSession.test.js +1 -1
- package/esm/domain/__tests__/IndirectTransfer.test.js +1 -1
- package/esm/domain/__tests__/Meeting.test.js +87 -1
- package/esm/domain/__tests__/MeetingAuthorization.test.js +109 -0
- package/esm/domain/__tests__/Room.test.js +1 -1
- package/esm/index.js +258 -32
- package/esm/lib/WazoSessionDescriptionHandler.js +22 -1
- package/esm/service/CallApi.js +148 -2
- package/esm/service/getApiClient.js +148 -2
- package/esm/simple/Auth.js +258 -32
- package/esm/simple/Configuration.js +258 -32
- package/esm/simple/Directory.js +148 -2
- package/esm/simple/Phone.js +258 -32
- package/esm/simple/Websocket.js +3 -0
- package/esm/simple/index.js +258 -32
- package/esm/simple/room/LocalParticipant.js +258 -32
- package/esm/simple/room/Participant.js +258 -32
- package/esm/simple/room/RemoteParticipant.js +258 -32
- package/esm/simple/room/Room.js +258 -32
- package/esm/simple/room/SipRoom.js +258 -32
- package/esm/simple/room/Stream.js +258 -32
- package/esm/simple/room/__tests__/Participant.test.js +14747 -0
- package/esm/simple/room/__tests__/RemoteParticipant.test.js +258 -32
- package/esm/simple/utils.js +258 -32
- package/esm/utils/__tests__/object.test.js +57 -0
- package/esm/utils/__tests__/sdp.test.js +50 -0
- package/esm/utils/__tests__/string.test.js +30 -0
- package/esm/utils/object.js +24 -0
- package/esm/utils/sdp.js +19 -1
- package/esm/utils/string.js +10 -0
- package/esm/web-rtc-client.js +210 -26
- package/esm/websocket-client.js +3 -1
- package/lib/__tests__/api-client.test.js +148 -2
- package/lib/__tests__/web-rtc-client.test.js +303 -26
- package/lib/api/calld.js +14 -0
- package/lib/api/confd.js +134 -2
- package/lib/api/ctid-ng.js +6 -0
- package/lib/api-client.js +148 -2
- package/lib/checker/Checker.js +212 -26
- package/lib/checker/checks/aor.js +148 -2
- package/lib/checker/checks/api.js +148 -2
- package/lib/checker/checks/index.js +212 -26
- package/lib/checker/checks/wazo-websocket.js +2 -0
- package/lib/checker/checks/webrtc-transport.js +210 -26
- package/lib/checker/checks/webrtc.js +210 -26
- package/lib/domain/AdHocAPIConference.js +148 -2
- package/lib/domain/Call.js +6 -0
- package/lib/domain/CallSession.js +1 -1
- package/lib/domain/Features.js +148 -2
- package/lib/domain/Meeting.js +18 -0
- package/lib/domain/MeetingAuthorization.js +79 -0
- package/lib/domain/Phone/CTIPhone.js +149 -3
- package/lib/domain/Phone/WebRTCPhone.js +3 -3
- package/lib/domain/__tests__/Call.test.js +6 -0
- package/lib/domain/__tests__/CallSession.test.js +1 -1
- package/lib/domain/__tests__/IndirectTransfer.test.js +1 -1
- package/lib/domain/__tests__/Meeting.test.js +87 -1
- package/lib/domain/__tests__/MeetingAuthorization.test.js +111 -0
- package/lib/domain/__tests__/Room.test.js +1 -1
- package/lib/index.js +258 -32
- package/lib/lib/WazoSessionDescriptionHandler.js +22 -1
- package/lib/service/CallApi.js +148 -2
- package/lib/service/getApiClient.js +148 -2
- package/lib/simple/Auth.js +258 -32
- package/lib/simple/Configuration.js +258 -32
- package/lib/simple/Directory.js +148 -2
- package/lib/simple/Phone.js +258 -32
- package/lib/simple/Websocket.js +3 -0
- package/lib/simple/index.js +258 -32
- package/lib/simple/room/LocalParticipant.js +258 -32
- package/lib/simple/room/Participant.js +258 -32
- package/lib/simple/room/RemoteParticipant.js +258 -32
- package/lib/simple/room/Room.js +258 -32
- package/lib/simple/room/SipRoom.js +258 -32
- package/lib/simple/room/Stream.js +258 -32
- package/lib/simple/room/__tests__/Participant.test.js +14757 -0
- package/lib/simple/room/__tests__/RemoteParticipant.test.js +258 -32
- package/lib/simple/utils.js +258 -32
- package/lib/utils/__tests__/object.test.js +59 -0
- package/lib/utils/__tests__/sdp.test.js +50 -0
- package/lib/utils/__tests__/string.test.js +32 -0
- package/lib/utils/object.js +28 -0
- package/lib/utils/sdp.js +19 -0
- package/lib/utils/string.js +14 -0
- package/lib/web-rtc-client.js +210 -26
- package/lib/websocket-client.js +3 -0
- package/package.json +2 -2
- package/src/__tests__/web-rtc-client.test.js +93 -0
- package/src/api/calld.js +8 -0
- package/src/api/confd.js +43 -2
- package/src/domain/Call.js +6 -0
- package/src/domain/CallSession.js +1 -1
- package/src/domain/Meeting.js +20 -0
- package/src/domain/MeetingAuthorization.js +67 -0
- package/src/domain/Phone/WebRTCPhone.js +2 -2
- package/src/domain/__tests__/Meeting.test.js +70 -1
- package/src/domain/__tests__/MeetingAuthorization.test.js +58 -0
- package/src/lib/WazoSessionDescriptionHandler.js +5 -2
- package/src/simple/room/Participant.js +40 -0
- package/src/simple/room/Room.js +2 -2
- package/src/simple/room/SipRoom.js +1 -1
- package/src/simple/room/__tests__/Participant.test.js +81 -0
- package/src/types/WebSocketMessage.js +7 -1
- package/src/utils/__tests__/object.test.js +35 -0
- package/src/utils/__tests__/sdp.test.js +33 -1
- package/src/utils/__tests__/string.test.js +23 -0
- package/src/utils/object.js +15 -0
- package/src/utils/sdp.js +18 -0
- package/src/utils/string.js +8 -0
- package/src/web-rtc-client.js +40 -23
- package/src/websocket-client.js +2 -0
package/lib/simple/Auth.js
CHANGED
|
@@ -2657,6 +2657,70 @@ class ExternalApp {
|
|
|
2657
2657
|
|
|
2658
2658
|
//
|
|
2659
2659
|
|
|
2660
|
+
class MeetingAuthorization {
|
|
2661
|
+
|
|
2662
|
+
|
|
2663
|
+
|
|
2664
|
+
|
|
2665
|
+
|
|
2666
|
+
|
|
2667
|
+
constructor({
|
|
2668
|
+
meetingUuid,
|
|
2669
|
+
uuid,
|
|
2670
|
+
userUuid,
|
|
2671
|
+
userName,
|
|
2672
|
+
} = {}) {
|
|
2673
|
+
this.meetingUuid = meetingUuid;
|
|
2674
|
+
this.uuid = uuid;
|
|
2675
|
+
this.userUuid = userUuid;
|
|
2676
|
+
this.userName = userName;
|
|
2677
|
+
}
|
|
2678
|
+
|
|
2679
|
+
setStatus(status ) {
|
|
2680
|
+
this.status = status;
|
|
2681
|
+
}
|
|
2682
|
+
|
|
2683
|
+
getStatus() {
|
|
2684
|
+
return this.status;
|
|
2685
|
+
}
|
|
2686
|
+
|
|
2687
|
+
static parse(plain ) {
|
|
2688
|
+
const {
|
|
2689
|
+
meeting_uuid: meetingUuid,
|
|
2690
|
+
uuid,
|
|
2691
|
+
guest_uuid: userUuid,
|
|
2692
|
+
guest_name: userName,
|
|
2693
|
+
} = plain;
|
|
2694
|
+
|
|
2695
|
+
return new MeetingAuthorization({
|
|
2696
|
+
meetingUuid,
|
|
2697
|
+
uuid,
|
|
2698
|
+
userUuid,
|
|
2699
|
+
userName,
|
|
2700
|
+
});
|
|
2701
|
+
}
|
|
2702
|
+
|
|
2703
|
+
static parseMany(items ) {
|
|
2704
|
+
if (!items) {
|
|
2705
|
+
return [];
|
|
2706
|
+
}
|
|
2707
|
+
return items.map(MeetingAuthorization.parse);
|
|
2708
|
+
}
|
|
2709
|
+
}
|
|
2710
|
+
|
|
2711
|
+
//
|
|
2712
|
+
|
|
2713
|
+
|
|
2714
|
+
|
|
2715
|
+
|
|
2716
|
+
|
|
2717
|
+
|
|
2718
|
+
|
|
2719
|
+
|
|
2720
|
+
|
|
2721
|
+
|
|
2722
|
+
|
|
2723
|
+
|
|
2660
2724
|
|
|
2661
2725
|
|
|
2662
2726
|
|
|
@@ -2667,6 +2731,7 @@ class ExternalApp {
|
|
|
2667
2731
|
|
|
2668
2732
|
|
|
2669
2733
|
|
|
2734
|
+
|
|
2670
2735
|
|
|
2671
2736
|
|
|
2672
2737
|
class Meeting {
|
|
@@ -2681,6 +2746,8 @@ class Meeting {
|
|
|
2681
2746
|
|
|
2682
2747
|
|
|
2683
2748
|
|
|
2749
|
+
|
|
2750
|
+
|
|
2684
2751
|
|
|
2685
2752
|
static parse(plain ) {
|
|
2686
2753
|
return new Meeting({
|
|
@@ -2693,6 +2760,7 @@ class Meeting {
|
|
|
2693
2760
|
extension: plain.exten,
|
|
2694
2761
|
persistent: plain.persistent,
|
|
2695
2762
|
creationTime: moment__default['default'](plain.creation_time).toDate(),
|
|
2763
|
+
requireAuthorization: plain.require_authorization,
|
|
2696
2764
|
});
|
|
2697
2765
|
}
|
|
2698
2766
|
|
|
@@ -2717,6 +2785,7 @@ class Meeting {
|
|
|
2717
2785
|
extension,
|
|
2718
2786
|
persistent,
|
|
2719
2787
|
creationTime,
|
|
2788
|
+
requireAuthorization,
|
|
2720
2789
|
} = {}) {
|
|
2721
2790
|
this.guestSipAuthorization = guestSipAuthorization;
|
|
2722
2791
|
this.uri = uri;
|
|
@@ -2727,6 +2796,7 @@ class Meeting {
|
|
|
2727
2796
|
this.extension = extension;
|
|
2728
2797
|
this.persistent = persistent;
|
|
2729
2798
|
this.creationTime = creationTime;
|
|
2799
|
+
this.requireAuthorization = requireAuthorization;
|
|
2730
2800
|
|
|
2731
2801
|
// Useful to compare instead of instanceof with minified code
|
|
2732
2802
|
this.type = 'Meeting';
|
|
@@ -2737,8 +2807,32 @@ class Meeting {
|
|
|
2737
2807
|
const [username, secret] = atob(this.guestSipAuthorization).split(':');
|
|
2738
2808
|
return { username, secret };
|
|
2739
2809
|
}
|
|
2810
|
+
|
|
2740
2811
|
}
|
|
2741
2812
|
|
|
2813
|
+
//
|
|
2814
|
+
|
|
2815
|
+
const camelToUnderscore = (key ) => {
|
|
2816
|
+
if (typeof key !== 'string') {
|
|
2817
|
+
throw new Error('Input is not a string');
|
|
2818
|
+
}
|
|
2819
|
+
return key.charAt(0).toLowerCase() + key.substring(1).replace(/([A-Z])/g, '_$1').toLowerCase();
|
|
2820
|
+
};
|
|
2821
|
+
|
|
2822
|
+
//
|
|
2823
|
+
|
|
2824
|
+
const convertKeysFromCamelToUnderscore = (args ) => {
|
|
2825
|
+
if (!args || typeof args !== 'object' || Array.isArray(args)) {
|
|
2826
|
+
throw new Error('Input is not an object');
|
|
2827
|
+
}
|
|
2828
|
+
|
|
2829
|
+
return Object.keys(args).reduce((acc, key) => {
|
|
2830
|
+
acc[camelToUnderscore(key)] = typeof args[key] === 'object' && !Array.isArray(args[key])
|
|
2831
|
+
? convertKeysFromCamelToUnderscore(args[key]) : args[key];
|
|
2832
|
+
return acc;
|
|
2833
|
+
}, {});
|
|
2834
|
+
};
|
|
2835
|
+
|
|
2742
2836
|
/* */
|
|
2743
2837
|
|
|
2744
2838
|
var confdMethods = (client , baseUrl ) => ({
|
|
@@ -2807,8 +2901,18 @@ var confdMethods = (client , baseUrl ) => ({
|
|
|
2807
2901
|
getMyMeetings: () =>
|
|
2808
2902
|
client.get(`${baseUrl}/users/me/meetings`).then(response => Meeting.parseMany(response.items)),
|
|
2809
2903
|
|
|
2810
|
-
createMyMeeting: (
|
|
2811
|
-
client
|
|
2904
|
+
createMyMeeting: (args ) =>
|
|
2905
|
+
client
|
|
2906
|
+
.post(`${baseUrl}/users/me/meetings`, convertKeysFromCamelToUnderscore(args))
|
|
2907
|
+
.then(Meeting.parse),
|
|
2908
|
+
|
|
2909
|
+
updateMyMeeting: (meetingUuid , data ) =>
|
|
2910
|
+
client.put(
|
|
2911
|
+
`${baseUrl}/users/me/meetings/${meetingUuid}`,
|
|
2912
|
+
convertKeysFromCamelToUnderscore(data),
|
|
2913
|
+
null,
|
|
2914
|
+
ApiRequester.successResponseParser,
|
|
2915
|
+
),
|
|
2812
2916
|
|
|
2813
2917
|
deleteMyMeeting: (meetingUuid ) =>
|
|
2814
2918
|
client.delete(`${baseUrl}/users/me/meetings/${meetingUuid}`, null),
|
|
@@ -2816,8 +2920,36 @@ var confdMethods = (client , baseUrl ) => ({
|
|
|
2816
2920
|
getMeeting: (meetingUuid ) =>
|
|
2817
2921
|
client.get(`${baseUrl}/meetings/${meetingUuid}`, null).then(Meeting.parse),
|
|
2818
2922
|
|
|
2923
|
+
meetingAuthorizations: (meetingUuid ) =>
|
|
2924
|
+
client.get(`${baseUrl}/users/me/meetings/${meetingUuid}/authorizations`, null).then(MeetingAuthorization.parseMany),
|
|
2925
|
+
|
|
2926
|
+
meetingAuthorizationReject: (meetingUuid , authorizationUuid ) =>
|
|
2927
|
+
client.put(
|
|
2928
|
+
`${baseUrl}/users/me/meetings/${meetingUuid}/authorizations/${authorizationUuid}/reject`,
|
|
2929
|
+
{},
|
|
2930
|
+
null,
|
|
2931
|
+
ApiRequester.successResponseParser,
|
|
2932
|
+
),
|
|
2933
|
+
|
|
2934
|
+
meetingAuthorizationAccept: (meetingUuid , authorizationUuid ) =>
|
|
2935
|
+
client.put(
|
|
2936
|
+
`${baseUrl}/users/me/meetings/${meetingUuid}/authorizations/${authorizationUuid}/accept`,
|
|
2937
|
+
{},
|
|
2938
|
+
null,
|
|
2939
|
+
ApiRequester.successResponseParser,
|
|
2940
|
+
),
|
|
2941
|
+
|
|
2819
2942
|
guestGetMeeting: (meetingUuid ) =>
|
|
2820
2943
|
client.get(`${baseUrl}/guests/me/meetings/${meetingUuid}`, null).then(Meeting.parse),
|
|
2944
|
+
|
|
2945
|
+
guestAuthorizationRequest: (userUuid , meetingUuid , username ) =>
|
|
2946
|
+
client
|
|
2947
|
+
.post(`${baseUrl}/guests/${userUuid}/meetings/${meetingUuid}/authorizations`, { guest_name: username })
|
|
2948
|
+
.then(MeetingAuthorization.parse),
|
|
2949
|
+
|
|
2950
|
+
guestAuthorizationCheck: (userUuid , meetingUuid , authorizationUuid ) =>
|
|
2951
|
+
client.get(`${baseUrl}/guests/${userUuid}/meetings/${meetingUuid}/authorizations/${authorizationUuid}`, null),
|
|
2952
|
+
|
|
2821
2953
|
});
|
|
2822
2954
|
|
|
2823
2955
|
//
|
|
@@ -3083,6 +3215,7 @@ const RECORD_STATE_ACTIVE = 'active';
|
|
|
3083
3215
|
|
|
3084
3216
|
|
|
3085
3217
|
|
|
3218
|
+
|
|
3086
3219
|
|
|
3087
3220
|
|
|
3088
3221
|
|
|
@@ -3093,6 +3226,7 @@ const RECORD_STATE_ACTIVE = 'active';
|
|
|
3093
3226
|
|
|
3094
3227
|
|
|
3095
3228
|
|
|
3229
|
+
|
|
3096
3230
|
|
|
3097
3231
|
|
|
3098
3232
|
|
|
@@ -3121,6 +3255,7 @@ class Call {
|
|
|
3121
3255
|
|
|
3122
3256
|
|
|
3123
3257
|
|
|
3258
|
+
|
|
3124
3259
|
|
|
3125
3260
|
|
|
3126
3261
|
|
|
@@ -3145,6 +3280,7 @@ class Call {
|
|
|
3145
3280
|
calleeNumber: plain.peer_caller_id_number,
|
|
3146
3281
|
dialedExtension: plain.dialed_extension,
|
|
3147
3282
|
isCaller: plain.is_caller,
|
|
3283
|
+
isVideo: plain.is_video,
|
|
3148
3284
|
muted: plain.muted,
|
|
3149
3285
|
onHold: plain.on_hold,
|
|
3150
3286
|
status: plain.status,
|
|
@@ -3168,6 +3304,7 @@ class Call {
|
|
|
3168
3304
|
calleeNumber,
|
|
3169
3305
|
dialedExtension,
|
|
3170
3306
|
isCaller,
|
|
3307
|
+
isVideo,
|
|
3171
3308
|
lineId,
|
|
3172
3309
|
muted,
|
|
3173
3310
|
onHold,
|
|
@@ -3191,6 +3328,7 @@ class Call {
|
|
|
3191
3328
|
this.startingTime = startingTime;
|
|
3192
3329
|
this.talkingToIds = talkingToIds || [];
|
|
3193
3330
|
this.recording = recording;
|
|
3331
|
+
this.isVideo = !!isVideo;
|
|
3194
3332
|
|
|
3195
3333
|
// Useful to compare instead of instanceof with minified code
|
|
3196
3334
|
this.type = 'Call';
|
|
@@ -3664,7 +3802,7 @@ class CallSession {
|
|
|
3664
3802
|
ringing: call.isRinging(),
|
|
3665
3803
|
answered: call.isUp(),
|
|
3666
3804
|
answeredBySystem: call.isUp() && call.talkingToIds.length === 0,
|
|
3667
|
-
cameraEnabled:
|
|
3805
|
+
cameraEnabled: call.isVideo,
|
|
3668
3806
|
dialedExtension: call.dialedExtension,
|
|
3669
3807
|
call,
|
|
3670
3808
|
conference: false, // @FIXME?
|
|
@@ -5062,6 +5200,14 @@ var calldMethods = (client , baseUrl ) => ({
|
|
|
5062
5200
|
getMeetingParticipantsAsUser: async (meetingUuid ) =>
|
|
5063
5201
|
client.get(`${baseUrl}/users/me/meetings/${meetingUuid}/participants`),
|
|
5064
5202
|
|
|
5203
|
+
banMeetingParticipant: (meetingUuid , participantUuid ) =>
|
|
5204
|
+
client.delete(
|
|
5205
|
+
`${baseUrl}/users/me/meetings/${meetingUuid}/participants/${participantUuid}`,
|
|
5206
|
+
null,
|
|
5207
|
+
null,
|
|
5208
|
+
ApiRequester.successResponseParser,
|
|
5209
|
+
),
|
|
5210
|
+
|
|
5065
5211
|
listTrunks: () => client.get(`${baseUrl}/trunks`),
|
|
5066
5212
|
|
|
5067
5213
|
mute: (callId ) =>
|
|
@@ -5909,6 +6055,24 @@ const fixSdp = (sdp , candidates , forcePort = true)
|
|
|
5909
6055
|
return fixed;
|
|
5910
6056
|
};
|
|
5911
6057
|
|
|
6058
|
+
const addIcesInAllBundles = (sdp ) => {
|
|
6059
|
+
const parsedSdp = sdpParser__default['default'].parse(sdp);
|
|
6060
|
+
|
|
6061
|
+
const mediaWithCandidate = parsedSdp.media.find(media => !!media.candidates);
|
|
6062
|
+
if (!mediaWithCandidate) {
|
|
6063
|
+
return sdp;
|
|
6064
|
+
}
|
|
6065
|
+
|
|
6066
|
+
const { candidates } = mediaWithCandidate;
|
|
6067
|
+
|
|
6068
|
+
parsedSdp.media = parsedSdp.media.map(media => ({
|
|
6069
|
+
...media,
|
|
6070
|
+
candidates: media.candidates || candidates,
|
|
6071
|
+
}));
|
|
6072
|
+
|
|
6073
|
+
return sdpParser__default['default'].write(parsedSdp);
|
|
6074
|
+
};
|
|
6075
|
+
|
|
5912
6076
|
/* global RTCSessionDescriptionInit, navigator */
|
|
5913
6077
|
|
|
5914
6078
|
const wazoLogger = IssueReporter$1 ? IssueReporter$1.loggerFor('webrtc-sdh') : console;
|
|
@@ -6038,7 +6202,10 @@ class WazoSessionDescriptionHandler extends sessionDescriptionHandler.SessionDes
|
|
|
6038
6202
|
|
|
6039
6203
|
// Check if we got ICEs
|
|
6040
6204
|
if (sdp.indexOf('a=candidate') !== -1) {
|
|
6041
|
-
return
|
|
6205
|
+
return {
|
|
6206
|
+
type: description.type,
|
|
6207
|
+
sdp: addIcesInAllBundles(sdp),
|
|
6208
|
+
};
|
|
6042
6209
|
}
|
|
6043
6210
|
|
|
6044
6211
|
wazoLogger.info('No ICE candidates found in SDP, fixing it with gathered ices', this.gatheredCandidates);
|
|
@@ -7498,41 +7665,58 @@ class WebRTCClient extends Emitter {
|
|
|
7498
7665
|
});
|
|
7499
7666
|
}
|
|
7500
7667
|
|
|
7501
|
-
changeAudioInputDevice(id , session ) {
|
|
7668
|
+
async changeAudioInputDevice(id , session , force ) {
|
|
7502
7669
|
const currentId = this.getAudioDeviceId();
|
|
7503
7670
|
logger$9.info('setting audio input device', { id, currentId, session: !!session });
|
|
7504
7671
|
|
|
7505
|
-
if (id === currentId) {
|
|
7672
|
+
if (!force && id === currentId) {
|
|
7506
7673
|
return null;
|
|
7507
7674
|
}
|
|
7508
7675
|
|
|
7676
|
+
// in order to handle an audio track change for default devices
|
|
7677
|
+
// we need the actual id of the device (not 'default')
|
|
7678
|
+
let deviceId = id;
|
|
7679
|
+
if (id === 'default' && navigator.mediaDevices) {
|
|
7680
|
+
const devices = await navigator.mediaDevices.enumerateDevices();
|
|
7681
|
+
const defaultDevice = devices.find(device => device.deviceId === 'default');
|
|
7682
|
+
if (defaultDevice) {
|
|
7683
|
+
const deviceLabel = defaultDevice.label.replace('Default - ', '');
|
|
7684
|
+
const targetDevice = devices.find(device => device.label === deviceLabel);
|
|
7685
|
+
if (targetDevice) {
|
|
7686
|
+
deviceId = targetDevice.deviceId;
|
|
7687
|
+
if (!force && deviceId === currentId) {
|
|
7688
|
+
return null;
|
|
7689
|
+
}
|
|
7690
|
+
}
|
|
7691
|
+
}
|
|
7692
|
+
}
|
|
7693
|
+
|
|
7509
7694
|
// let's update the local audio value
|
|
7510
7695
|
if (this.audio) {
|
|
7511
7696
|
this.audio = {
|
|
7512
7697
|
deviceId: {
|
|
7513
|
-
exact:
|
|
7698
|
+
exact: deviceId,
|
|
7514
7699
|
},
|
|
7515
7700
|
};
|
|
7516
7701
|
}
|
|
7517
7702
|
|
|
7518
|
-
if (session) {
|
|
7703
|
+
if (session && navigator.mediaDevices) {
|
|
7519
7704
|
const sdh = session.sessionDescriptionHandler;
|
|
7520
7705
|
const pc = sdh.peerConnection;
|
|
7521
7706
|
|
|
7522
|
-
|
|
7523
|
-
|
|
7524
|
-
|
|
7525
|
-
|
|
7707
|
+
const constraints = { audio: { deviceId: { exact: deviceId } } };
|
|
7708
|
+
const stream = await navigator.mediaDevices.getUserMedia(constraints);
|
|
7709
|
+
const audioTrack = stream.getAudioTracks()[0];
|
|
7710
|
+
const sender = pc && pc.getSenders().find(s => audioTrack && s && s.track && s.track.kind === audioTrack.kind);
|
|
7526
7711
|
|
|
7527
|
-
|
|
7528
|
-
|
|
7529
|
-
|
|
7530
|
-
}
|
|
7531
|
-
sender.replaceTrack(audioTrack);
|
|
7712
|
+
if (sender) {
|
|
7713
|
+
if (sender.track) {
|
|
7714
|
+
audioTrack.enabled = sender.track.enabled;
|
|
7532
7715
|
}
|
|
7716
|
+
sender.replaceTrack(audioTrack);
|
|
7717
|
+
}
|
|
7533
7718
|
|
|
7534
|
-
|
|
7535
|
-
});
|
|
7719
|
+
return stream;
|
|
7536
7720
|
}
|
|
7537
7721
|
}
|
|
7538
7722
|
|
|
@@ -7552,14 +7736,14 @@ class WebRTCClient extends Emitter {
|
|
|
7552
7736
|
return null;
|
|
7553
7737
|
}
|
|
7554
7738
|
|
|
7555
|
-
// let's
|
|
7556
|
-
|
|
7557
|
-
|
|
7558
|
-
|
|
7559
|
-
|
|
7560
|
-
|
|
7561
|
-
}
|
|
7562
|
-
}
|
|
7739
|
+
// let's make sure we don't lose other video constraints settings -- width, height, frameRate...
|
|
7740
|
+
const videoObject = typeof this.video === 'object' ? this.video : {};
|
|
7741
|
+
this.video = {
|
|
7742
|
+
...videoObject,
|
|
7743
|
+
deviceId: {
|
|
7744
|
+
exact: id,
|
|
7745
|
+
},
|
|
7746
|
+
};
|
|
7563
7747
|
}
|
|
7564
7748
|
|
|
7565
7749
|
changeSessionVideoInputDevice(id , session ) {
|
|
@@ -9298,10 +9482,10 @@ class WebRTCPhone extends Emitter {
|
|
|
9298
9482
|
this.audioRingVolume = volume;
|
|
9299
9483
|
}
|
|
9300
9484
|
|
|
9301
|
-
changeAudioInputDevice(id ) {
|
|
9485
|
+
changeAudioInputDevice(id , force ) {
|
|
9302
9486
|
logger$8.info('WebRTC phone - changeAudio input device', { deviceId: id });
|
|
9303
9487
|
|
|
9304
|
-
return this.client.changeAudioInputDevice(id, this.currentSipSession);
|
|
9488
|
+
return this.client.changeAudioInputDevice(id, this.currentSipSession, force);
|
|
9305
9489
|
}
|
|
9306
9490
|
|
|
9307
9491
|
changeVideoInputDevice(id ) {
|
|
@@ -10954,6 +11138,7 @@ const AGENT_UNPAUSED = 'agent_unpaused';
|
|
|
10954
11138
|
const CONFERENCE_ADHOC_PARTICIPANT_LEFT = 'conference_adhoc_participant_left';
|
|
10955
11139
|
const CONFERENCE_ADHOC_DELETED = 'conference_adhoc_deleted';
|
|
10956
11140
|
const MEETING_USER_PROGRESS = 'meeting_user_progress';
|
|
11141
|
+
const MEETING_USER_GUEST_AUTHORIZATION_CREATED = 'meeting_user_guest_authorization_created';
|
|
10957
11142
|
|
|
10958
11143
|
const BLACKLIST_EVENTS = [
|
|
10959
11144
|
CHAT_MESSAGE_SENT,
|
|
@@ -11305,6 +11490,7 @@ WebSocketClient.eventLists = [
|
|
|
11305
11490
|
CONFERENCE_ADHOC_PARTICIPANT_LEFT,
|
|
11306
11491
|
CONFERENCE_ADHOC_DELETED,
|
|
11307
11492
|
MEETING_USER_PROGRESS,
|
|
11493
|
+
MEETING_USER_GUEST_AUTHORIZATION_CREATED,
|
|
11308
11494
|
];
|
|
11309
11495
|
|
|
11310
11496
|
var WebSocketClient$1 = /*#__PURE__*/Object.freeze({
|
|
@@ -11376,6 +11562,7 @@ var WebSocketClient$1 = /*#__PURE__*/Object.freeze({
|
|
|
11376
11562
|
CONFERENCE_ADHOC_PARTICIPANT_LEFT: CONFERENCE_ADHOC_PARTICIPANT_LEFT,
|
|
11377
11563
|
CONFERENCE_ADHOC_DELETED: CONFERENCE_ADHOC_DELETED,
|
|
11378
11564
|
MEETING_USER_PROGRESS: MEETING_USER_PROGRESS,
|
|
11565
|
+
MEETING_USER_GUEST_AUTHORIZATION_CREATED: MEETING_USER_GUEST_AUTHORIZATION_CREATED,
|
|
11379
11566
|
HEARTBEAT_ENGINE_VERSION: HEARTBEAT_ENGINE_VERSION,
|
|
11380
11567
|
'default': WebSocketClient
|
|
11381
11568
|
});
|
|
@@ -11480,6 +11667,7 @@ class Participant extends Emitter {
|
|
|
11480
11667
|
|
|
11481
11668
|
|
|
11482
11669
|
|
|
11670
|
+
|
|
11483
11671
|
|
|
11484
11672
|
|
|
11485
11673
|
|
|
@@ -11497,6 +11685,7 @@ class Participant extends Emitter {
|
|
|
11497
11685
|
|
|
11498
11686
|
|
|
11499
11687
|
|
|
11688
|
+
|
|
11500
11689
|
|
|
11501
11690
|
/**
|
|
11502
11691
|
* @param room Room The room where the participant is
|
|
@@ -11520,6 +11709,7 @@ class Participant extends Emitter {
|
|
|
11520
11709
|
this.screensharing = false;
|
|
11521
11710
|
this.isOnHold = false;
|
|
11522
11711
|
this.extra = extra;
|
|
11712
|
+
this.banned = false;
|
|
11523
11713
|
|
|
11524
11714
|
this.ON_UPDATED = 'participant/ON_UPDATED';
|
|
11525
11715
|
this.ON_START_TALKING = 'participant/ON_START_TALKING';
|
|
@@ -11536,6 +11726,7 @@ class Participant extends Emitter {
|
|
|
11536
11726
|
this.ON_EXTRA_CHANGE = 'participant/ON_EXTRA_CHANGE';
|
|
11537
11727
|
this.ON_HOLD = 'participant/ON_HOLD';
|
|
11538
11728
|
this.ON_RESUME = 'participant/ON_RESUME';
|
|
11729
|
+
this.ON_BAN = 'participant/ON_BAN';
|
|
11539
11730
|
}
|
|
11540
11731
|
|
|
11541
11732
|
triggerEvent(name , ...args ) {
|
|
@@ -11576,6 +11767,10 @@ class Participant extends Emitter {
|
|
|
11576
11767
|
status.extra = this.extra;
|
|
11577
11768
|
break;
|
|
11578
11769
|
}
|
|
11770
|
+
case this.ON_BAN: {
|
|
11771
|
+
status.banned = true;
|
|
11772
|
+
break;
|
|
11773
|
+
}
|
|
11579
11774
|
}
|
|
11580
11775
|
|
|
11581
11776
|
if (broadcast) {
|
|
@@ -11678,6 +11873,11 @@ class Participant extends Emitter {
|
|
|
11678
11873
|
this.triggerUpdate(this.ON_RESUME, broadcast);
|
|
11679
11874
|
}
|
|
11680
11875
|
|
|
11876
|
+
onBan(broadcast = true) {
|
|
11877
|
+
this.banned = true;
|
|
11878
|
+
this.triggerUpdate(this.ON_BAN, broadcast);
|
|
11879
|
+
}
|
|
11880
|
+
|
|
11681
11881
|
getStatus() {
|
|
11682
11882
|
return {
|
|
11683
11883
|
callId: this.callId,
|
|
@@ -11724,6 +11924,10 @@ class Participant extends Emitter {
|
|
|
11724
11924
|
}
|
|
11725
11925
|
}
|
|
11726
11926
|
|
|
11927
|
+
if (status.banned) {
|
|
11928
|
+
this.onBan(false);
|
|
11929
|
+
}
|
|
11930
|
+
|
|
11727
11931
|
// Poor man's object comparison
|
|
11728
11932
|
if (typeof status.extra !== 'undefined' && JSON.stringify(this.extra) !== JSON.stringify(status.extra)) {
|
|
11729
11933
|
this.extra = { ...this.extra, ...status.extra };
|
|
@@ -11751,6 +11955,28 @@ class Participant extends Emitter {
|
|
|
11751
11955
|
this.streams = streams;
|
|
11752
11956
|
this.videoStreams = streams;
|
|
11753
11957
|
}
|
|
11958
|
+
|
|
11959
|
+
async ban(apiRequestDelay = null) {
|
|
11960
|
+
const { meetingUuid } = this.room;
|
|
11961
|
+
if (!meetingUuid) {
|
|
11962
|
+
throw new Error('Attempting to ban a participant without a `meetingUuid`');
|
|
11963
|
+
}
|
|
11964
|
+
|
|
11965
|
+
// this notifies all that someone is being banned
|
|
11966
|
+
this.onBan(true);
|
|
11967
|
+
|
|
11968
|
+
// this allows to delay the actual ban, in order for the banned participant as well as others to react to the situation
|
|
11969
|
+
if (apiRequestDelay) {
|
|
11970
|
+
await this.delay(apiRequestDelay);
|
|
11971
|
+
}
|
|
11972
|
+
|
|
11973
|
+
// proceed with the actual kick
|
|
11974
|
+
return getApiClient().calld.banMeetingParticipant(meetingUuid, this.callId);
|
|
11975
|
+
}
|
|
11976
|
+
|
|
11977
|
+
async delay(ms ) {
|
|
11978
|
+
return new Promise(resolve => setTimeout(resolve, ms));
|
|
11979
|
+
}
|
|
11754
11980
|
}
|
|
11755
11981
|
|
|
11756
11982
|
//
|
|
@@ -11903,7 +12129,7 @@ class Room$1 extends Emitter {
|
|
|
11903
12129
|
logger$3.info('connecting to room', { extension, audioOnly, room: !!room });
|
|
11904
12130
|
|
|
11905
12131
|
if (!room) {
|
|
11906
|
-
await Wazo.Phone.connect();
|
|
12132
|
+
await Wazo.Phone.connect({ media: constraints });
|
|
11907
12133
|
|
|
11908
12134
|
const withCamera = constraints && !!constraints.video;
|
|
11909
12135
|
|
|
@@ -12348,7 +12574,7 @@ class Room$1 extends Emitter {
|
|
|
12348
12574
|
const participant = this._getParticipantFromCallId(status.callId);
|
|
12349
12575
|
|
|
12350
12576
|
if (participant) {
|
|
12351
|
-
// we're
|
|
12577
|
+
// we're receiving, so no need to broadcast
|
|
12352
12578
|
participant.updateStatus(status, false);
|
|
12353
12579
|
}
|
|
12354
12580
|
break;
|
|
@@ -12615,7 +12841,7 @@ class SipRoom extends Room$1 {
|
|
|
12615
12841
|
logger$2.info('connecting to sip room', { extension, audioOnly, room: !!room });
|
|
12616
12842
|
|
|
12617
12843
|
if (!room) {
|
|
12618
|
-
await Wazo.Phone.connect();
|
|
12844
|
+
await Wazo.Phone.connect({ media: constraints });
|
|
12619
12845
|
|
|
12620
12846
|
const withCamera = constraints && !!constraints.video;
|
|
12621
12847
|
|