@wazo/sdk 0.38.5 → 0.38.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/dist/wazo-sdk.js +2 -2
- package/esm/__tests__/api-client.test.js +148 -2
- package/esm/__tests__/web-rtc-client.test.js +303 -26
- package/esm/api/calld.js +14 -0
- package/esm/api/confd.js +134 -2
- package/esm/api/ctid-ng.js +6 -0
- package/esm/api-client.js +148 -2
- package/esm/checker/Checker.js +212 -26
- package/esm/checker/checks/aor.js +148 -2
- package/esm/checker/checks/api.js +148 -2
- package/esm/checker/checks/index.js +212 -26
- package/esm/checker/checks/wazo-websocket.js +2 -0
- package/esm/checker/checks/webrtc-transport.js +210 -26
- package/esm/checker/checks/webrtc.js +210 -26
- package/esm/domain/AdHocAPIConference.js +148 -2
- package/esm/domain/Call.js +6 -0
- package/esm/domain/CallSession.js +1 -1
- package/esm/domain/Features.js +148 -2
- package/esm/domain/Meeting.js +18 -0
- package/esm/domain/MeetingAuthorization.js +70 -0
- package/esm/domain/Phone/CTIPhone.js +149 -3
- package/esm/domain/Phone/WebRTCPhone.js +3 -3
- package/esm/domain/__tests__/Call.test.js +6 -0
- package/esm/domain/__tests__/CallSession.test.js +1 -1
- package/esm/domain/__tests__/IndirectTransfer.test.js +1 -1
- package/esm/domain/__tests__/Meeting.test.js +87 -1
- package/esm/domain/__tests__/MeetingAuthorization.test.js +109 -0
- package/esm/domain/__tests__/Room.test.js +1 -1
- package/esm/index.js +258 -32
- package/esm/lib/WazoSessionDescriptionHandler.js +22 -1
- package/esm/service/CallApi.js +148 -2
- package/esm/service/getApiClient.js +148 -2
- package/esm/simple/Auth.js +258 -32
- package/esm/simple/Configuration.js +258 -32
- package/esm/simple/Directory.js +148 -2
- package/esm/simple/Phone.js +258 -32
- package/esm/simple/Websocket.js +3 -0
- package/esm/simple/index.js +258 -32
- package/esm/simple/room/LocalParticipant.js +258 -32
- package/esm/simple/room/Participant.js +258 -32
- package/esm/simple/room/RemoteParticipant.js +258 -32
- package/esm/simple/room/Room.js +258 -32
- package/esm/simple/room/SipRoom.js +258 -32
- package/esm/simple/room/Stream.js +258 -32
- package/esm/simple/room/__tests__/Participant.test.js +14747 -0
- package/esm/simple/room/__tests__/RemoteParticipant.test.js +258 -32
- package/esm/simple/utils.js +258 -32
- package/esm/utils/__tests__/object.test.js +57 -0
- package/esm/utils/__tests__/sdp.test.js +50 -0
- package/esm/utils/__tests__/string.test.js +30 -0
- package/esm/utils/object.js +24 -0
- package/esm/utils/sdp.js +19 -1
- package/esm/utils/string.js +10 -0
- package/esm/web-rtc-client.js +210 -26
- package/esm/websocket-client.js +3 -1
- package/lib/__tests__/api-client.test.js +148 -2
- package/lib/__tests__/web-rtc-client.test.js +303 -26
- package/lib/api/calld.js +14 -0
- package/lib/api/confd.js +134 -2
- package/lib/api/ctid-ng.js +6 -0
- package/lib/api-client.js +148 -2
- package/lib/checker/Checker.js +212 -26
- package/lib/checker/checks/aor.js +148 -2
- package/lib/checker/checks/api.js +148 -2
- package/lib/checker/checks/index.js +212 -26
- package/lib/checker/checks/wazo-websocket.js +2 -0
- package/lib/checker/checks/webrtc-transport.js +210 -26
- package/lib/checker/checks/webrtc.js +210 -26
- package/lib/domain/AdHocAPIConference.js +148 -2
- package/lib/domain/Call.js +6 -0
- package/lib/domain/CallSession.js +1 -1
- package/lib/domain/Features.js +148 -2
- package/lib/domain/Meeting.js +18 -0
- package/lib/domain/MeetingAuthorization.js +79 -0
- package/lib/domain/Phone/CTIPhone.js +149 -3
- package/lib/domain/Phone/WebRTCPhone.js +3 -3
- package/lib/domain/__tests__/Call.test.js +6 -0
- package/lib/domain/__tests__/CallSession.test.js +1 -1
- package/lib/domain/__tests__/IndirectTransfer.test.js +1 -1
- package/lib/domain/__tests__/Meeting.test.js +87 -1
- package/lib/domain/__tests__/MeetingAuthorization.test.js +111 -0
- package/lib/domain/__tests__/Room.test.js +1 -1
- package/lib/index.js +258 -32
- package/lib/lib/WazoSessionDescriptionHandler.js +22 -1
- package/lib/service/CallApi.js +148 -2
- package/lib/service/getApiClient.js +148 -2
- package/lib/simple/Auth.js +258 -32
- package/lib/simple/Configuration.js +258 -32
- package/lib/simple/Directory.js +148 -2
- package/lib/simple/Phone.js +258 -32
- package/lib/simple/Websocket.js +3 -0
- package/lib/simple/index.js +258 -32
- package/lib/simple/room/LocalParticipant.js +258 -32
- package/lib/simple/room/Participant.js +258 -32
- package/lib/simple/room/RemoteParticipant.js +258 -32
- package/lib/simple/room/Room.js +258 -32
- package/lib/simple/room/SipRoom.js +258 -32
- package/lib/simple/room/Stream.js +258 -32
- package/lib/simple/room/__tests__/Participant.test.js +14757 -0
- package/lib/simple/room/__tests__/RemoteParticipant.test.js +258 -32
- package/lib/simple/utils.js +258 -32
- package/lib/utils/__tests__/object.test.js +59 -0
- package/lib/utils/__tests__/sdp.test.js +50 -0
- package/lib/utils/__tests__/string.test.js +32 -0
- package/lib/utils/object.js +28 -0
- package/lib/utils/sdp.js +19 -0
- package/lib/utils/string.js +14 -0
- package/lib/web-rtc-client.js +210 -26
- package/lib/websocket-client.js +3 -0
- package/package.json +2 -2
- package/src/__tests__/web-rtc-client.test.js +93 -0
- package/src/api/calld.js +8 -0
- package/src/api/confd.js +43 -2
- package/src/domain/Call.js +6 -0
- package/src/domain/CallSession.js +1 -1
- package/src/domain/Meeting.js +20 -0
- package/src/domain/MeetingAuthorization.js +67 -0
- package/src/domain/Phone/WebRTCPhone.js +2 -2
- package/src/domain/__tests__/Meeting.test.js +70 -1
- package/src/domain/__tests__/MeetingAuthorization.test.js +58 -0
- package/src/lib/WazoSessionDescriptionHandler.js +5 -2
- package/src/simple/room/Participant.js +40 -0
- package/src/simple/room/Room.js +2 -2
- package/src/simple/room/SipRoom.js +1 -1
- package/src/simple/room/__tests__/Participant.test.js +81 -0
- package/src/types/WebSocketMessage.js +7 -1
- package/src/utils/__tests__/object.test.js +35 -0
- package/src/utils/__tests__/sdp.test.js +33 -1
- package/src/utils/__tests__/string.test.js +23 -0
- package/src/utils/object.js +15 -0
- package/src/utils/sdp.js +18 -0
- package/src/utils/string.js +8 -0
- package/src/web-rtc-client.js +40 -23
- package/src/websocket-client.js +2 -0
|
@@ -2681,6 +2681,70 @@ class ExternalApp {
|
|
|
2681
2681
|
|
|
2682
2682
|
//
|
|
2683
2683
|
|
|
2684
|
+
class MeetingAuthorization {
|
|
2685
|
+
|
|
2686
|
+
|
|
2687
|
+
|
|
2688
|
+
|
|
2689
|
+
|
|
2690
|
+
|
|
2691
|
+
constructor({
|
|
2692
|
+
meetingUuid,
|
|
2693
|
+
uuid,
|
|
2694
|
+
userUuid,
|
|
2695
|
+
userName,
|
|
2696
|
+
} = {}) {
|
|
2697
|
+
this.meetingUuid = meetingUuid;
|
|
2698
|
+
this.uuid = uuid;
|
|
2699
|
+
this.userUuid = userUuid;
|
|
2700
|
+
this.userName = userName;
|
|
2701
|
+
}
|
|
2702
|
+
|
|
2703
|
+
setStatus(status ) {
|
|
2704
|
+
this.status = status;
|
|
2705
|
+
}
|
|
2706
|
+
|
|
2707
|
+
getStatus() {
|
|
2708
|
+
return this.status;
|
|
2709
|
+
}
|
|
2710
|
+
|
|
2711
|
+
static parse(plain ) {
|
|
2712
|
+
const {
|
|
2713
|
+
meeting_uuid: meetingUuid,
|
|
2714
|
+
uuid,
|
|
2715
|
+
guest_uuid: userUuid,
|
|
2716
|
+
guest_name: userName,
|
|
2717
|
+
} = plain;
|
|
2718
|
+
|
|
2719
|
+
return new MeetingAuthorization({
|
|
2720
|
+
meetingUuid,
|
|
2721
|
+
uuid,
|
|
2722
|
+
userUuid,
|
|
2723
|
+
userName,
|
|
2724
|
+
});
|
|
2725
|
+
}
|
|
2726
|
+
|
|
2727
|
+
static parseMany(items ) {
|
|
2728
|
+
if (!items) {
|
|
2729
|
+
return [];
|
|
2730
|
+
}
|
|
2731
|
+
return items.map(MeetingAuthorization.parse);
|
|
2732
|
+
}
|
|
2733
|
+
}
|
|
2734
|
+
|
|
2735
|
+
//
|
|
2736
|
+
|
|
2737
|
+
|
|
2738
|
+
|
|
2739
|
+
|
|
2740
|
+
|
|
2741
|
+
|
|
2742
|
+
|
|
2743
|
+
|
|
2744
|
+
|
|
2745
|
+
|
|
2746
|
+
|
|
2747
|
+
|
|
2684
2748
|
|
|
2685
2749
|
|
|
2686
2750
|
|
|
@@ -2691,6 +2755,7 @@ class ExternalApp {
|
|
|
2691
2755
|
|
|
2692
2756
|
|
|
2693
2757
|
|
|
2758
|
+
|
|
2694
2759
|
|
|
2695
2760
|
|
|
2696
2761
|
class Meeting {
|
|
@@ -2705,6 +2770,8 @@ class Meeting {
|
|
|
2705
2770
|
|
|
2706
2771
|
|
|
2707
2772
|
|
|
2773
|
+
|
|
2774
|
+
|
|
2708
2775
|
|
|
2709
2776
|
static parse(plain ) {
|
|
2710
2777
|
return new Meeting({
|
|
@@ -2717,6 +2784,7 @@ class Meeting {
|
|
|
2717
2784
|
extension: plain.exten,
|
|
2718
2785
|
persistent: plain.persistent,
|
|
2719
2786
|
creationTime: moment__default['default'](plain.creation_time).toDate(),
|
|
2787
|
+
requireAuthorization: plain.require_authorization,
|
|
2720
2788
|
});
|
|
2721
2789
|
}
|
|
2722
2790
|
|
|
@@ -2741,6 +2809,7 @@ class Meeting {
|
|
|
2741
2809
|
extension,
|
|
2742
2810
|
persistent,
|
|
2743
2811
|
creationTime,
|
|
2812
|
+
requireAuthorization,
|
|
2744
2813
|
} = {}) {
|
|
2745
2814
|
this.guestSipAuthorization = guestSipAuthorization;
|
|
2746
2815
|
this.uri = uri;
|
|
@@ -2751,6 +2820,7 @@ class Meeting {
|
|
|
2751
2820
|
this.extension = extension;
|
|
2752
2821
|
this.persistent = persistent;
|
|
2753
2822
|
this.creationTime = creationTime;
|
|
2823
|
+
this.requireAuthorization = requireAuthorization;
|
|
2754
2824
|
|
|
2755
2825
|
// Useful to compare instead of instanceof with minified code
|
|
2756
2826
|
this.type = 'Meeting';
|
|
@@ -2761,8 +2831,32 @@ class Meeting {
|
|
|
2761
2831
|
const [username, secret] = atob(this.guestSipAuthorization).split(':');
|
|
2762
2832
|
return { username, secret };
|
|
2763
2833
|
}
|
|
2834
|
+
|
|
2764
2835
|
}
|
|
2765
2836
|
|
|
2837
|
+
//
|
|
2838
|
+
|
|
2839
|
+
const camelToUnderscore = (key ) => {
|
|
2840
|
+
if (typeof key !== 'string') {
|
|
2841
|
+
throw new Error('Input is not a string');
|
|
2842
|
+
}
|
|
2843
|
+
return key.charAt(0).toLowerCase() + key.substring(1).replace(/([A-Z])/g, '_$1').toLowerCase();
|
|
2844
|
+
};
|
|
2845
|
+
|
|
2846
|
+
//
|
|
2847
|
+
|
|
2848
|
+
const convertKeysFromCamelToUnderscore = (args ) => {
|
|
2849
|
+
if (!args || typeof args !== 'object' || Array.isArray(args)) {
|
|
2850
|
+
throw new Error('Input is not an object');
|
|
2851
|
+
}
|
|
2852
|
+
|
|
2853
|
+
return Object.keys(args).reduce((acc, key) => {
|
|
2854
|
+
acc[camelToUnderscore(key)] = typeof args[key] === 'object' && !Array.isArray(args[key])
|
|
2855
|
+
? convertKeysFromCamelToUnderscore(args[key]) : args[key];
|
|
2856
|
+
return acc;
|
|
2857
|
+
}, {});
|
|
2858
|
+
};
|
|
2859
|
+
|
|
2766
2860
|
/* */
|
|
2767
2861
|
|
|
2768
2862
|
var confdMethods = (client , baseUrl ) => ({
|
|
@@ -2831,8 +2925,18 @@ var confdMethods = (client , baseUrl ) => ({
|
|
|
2831
2925
|
getMyMeetings: () =>
|
|
2832
2926
|
client.get(`${baseUrl}/users/me/meetings`).then(response => Meeting.parseMany(response.items)),
|
|
2833
2927
|
|
|
2834
|
-
createMyMeeting: (
|
|
2835
|
-
client
|
|
2928
|
+
createMyMeeting: (args ) =>
|
|
2929
|
+
client
|
|
2930
|
+
.post(`${baseUrl}/users/me/meetings`, convertKeysFromCamelToUnderscore(args))
|
|
2931
|
+
.then(Meeting.parse),
|
|
2932
|
+
|
|
2933
|
+
updateMyMeeting: (meetingUuid , data ) =>
|
|
2934
|
+
client.put(
|
|
2935
|
+
`${baseUrl}/users/me/meetings/${meetingUuid}`,
|
|
2936
|
+
convertKeysFromCamelToUnderscore(data),
|
|
2937
|
+
null,
|
|
2938
|
+
ApiRequester.successResponseParser,
|
|
2939
|
+
),
|
|
2836
2940
|
|
|
2837
2941
|
deleteMyMeeting: (meetingUuid ) =>
|
|
2838
2942
|
client.delete(`${baseUrl}/users/me/meetings/${meetingUuid}`, null),
|
|
@@ -2840,8 +2944,36 @@ var confdMethods = (client , baseUrl ) => ({
|
|
|
2840
2944
|
getMeeting: (meetingUuid ) =>
|
|
2841
2945
|
client.get(`${baseUrl}/meetings/${meetingUuid}`, null).then(Meeting.parse),
|
|
2842
2946
|
|
|
2947
|
+
meetingAuthorizations: (meetingUuid ) =>
|
|
2948
|
+
client.get(`${baseUrl}/users/me/meetings/${meetingUuid}/authorizations`, null).then(MeetingAuthorization.parseMany),
|
|
2949
|
+
|
|
2950
|
+
meetingAuthorizationReject: (meetingUuid , authorizationUuid ) =>
|
|
2951
|
+
client.put(
|
|
2952
|
+
`${baseUrl}/users/me/meetings/${meetingUuid}/authorizations/${authorizationUuid}/reject`,
|
|
2953
|
+
{},
|
|
2954
|
+
null,
|
|
2955
|
+
ApiRequester.successResponseParser,
|
|
2956
|
+
),
|
|
2957
|
+
|
|
2958
|
+
meetingAuthorizationAccept: (meetingUuid , authorizationUuid ) =>
|
|
2959
|
+
client.put(
|
|
2960
|
+
`${baseUrl}/users/me/meetings/${meetingUuid}/authorizations/${authorizationUuid}/accept`,
|
|
2961
|
+
{},
|
|
2962
|
+
null,
|
|
2963
|
+
ApiRequester.successResponseParser,
|
|
2964
|
+
),
|
|
2965
|
+
|
|
2843
2966
|
guestGetMeeting: (meetingUuid ) =>
|
|
2844
2967
|
client.get(`${baseUrl}/guests/me/meetings/${meetingUuid}`, null).then(Meeting.parse),
|
|
2968
|
+
|
|
2969
|
+
guestAuthorizationRequest: (userUuid , meetingUuid , username ) =>
|
|
2970
|
+
client
|
|
2971
|
+
.post(`${baseUrl}/guests/${userUuid}/meetings/${meetingUuid}/authorizations`, { guest_name: username })
|
|
2972
|
+
.then(MeetingAuthorization.parse),
|
|
2973
|
+
|
|
2974
|
+
guestAuthorizationCheck: (userUuid , meetingUuid , authorizationUuid ) =>
|
|
2975
|
+
client.get(`${baseUrl}/guests/${userUuid}/meetings/${meetingUuid}/authorizations/${authorizationUuid}`, null),
|
|
2976
|
+
|
|
2845
2977
|
});
|
|
2846
2978
|
|
|
2847
2979
|
//
|
|
@@ -3107,6 +3239,7 @@ const RECORD_STATE_ACTIVE = 'active';
|
|
|
3107
3239
|
|
|
3108
3240
|
|
|
3109
3241
|
|
|
3242
|
+
|
|
3110
3243
|
|
|
3111
3244
|
|
|
3112
3245
|
|
|
@@ -3117,6 +3250,7 @@ const RECORD_STATE_ACTIVE = 'active';
|
|
|
3117
3250
|
|
|
3118
3251
|
|
|
3119
3252
|
|
|
3253
|
+
|
|
3120
3254
|
|
|
3121
3255
|
|
|
3122
3256
|
|
|
@@ -3145,6 +3279,7 @@ class Call {
|
|
|
3145
3279
|
|
|
3146
3280
|
|
|
3147
3281
|
|
|
3282
|
+
|
|
3148
3283
|
|
|
3149
3284
|
|
|
3150
3285
|
|
|
@@ -3169,6 +3304,7 @@ class Call {
|
|
|
3169
3304
|
calleeNumber: plain.peer_caller_id_number,
|
|
3170
3305
|
dialedExtension: plain.dialed_extension,
|
|
3171
3306
|
isCaller: plain.is_caller,
|
|
3307
|
+
isVideo: plain.is_video,
|
|
3172
3308
|
muted: plain.muted,
|
|
3173
3309
|
onHold: plain.on_hold,
|
|
3174
3310
|
status: plain.status,
|
|
@@ -3192,6 +3328,7 @@ class Call {
|
|
|
3192
3328
|
calleeNumber,
|
|
3193
3329
|
dialedExtension,
|
|
3194
3330
|
isCaller,
|
|
3331
|
+
isVideo,
|
|
3195
3332
|
lineId,
|
|
3196
3333
|
muted,
|
|
3197
3334
|
onHold,
|
|
@@ -3215,6 +3352,7 @@ class Call {
|
|
|
3215
3352
|
this.startingTime = startingTime;
|
|
3216
3353
|
this.talkingToIds = talkingToIds || [];
|
|
3217
3354
|
this.recording = recording;
|
|
3355
|
+
this.isVideo = !!isVideo;
|
|
3218
3356
|
|
|
3219
3357
|
// Useful to compare instead of instanceof with minified code
|
|
3220
3358
|
this.type = 'Call';
|
|
@@ -3688,7 +3826,7 @@ class CallSession {
|
|
|
3688
3826
|
ringing: call.isRinging(),
|
|
3689
3827
|
answered: call.isUp(),
|
|
3690
3828
|
answeredBySystem: call.isUp() && call.talkingToIds.length === 0,
|
|
3691
|
-
cameraEnabled:
|
|
3829
|
+
cameraEnabled: call.isVideo,
|
|
3692
3830
|
dialedExtension: call.dialedExtension,
|
|
3693
3831
|
call,
|
|
3694
3832
|
conference: false, // @FIXME?
|
|
@@ -5060,6 +5198,14 @@ var calldMethods = (client , baseUrl ) => ({
|
|
|
5060
5198
|
getMeetingParticipantsAsUser: async (meetingUuid ) =>
|
|
5061
5199
|
client.get(`${baseUrl}/users/me/meetings/${meetingUuid}/participants`),
|
|
5062
5200
|
|
|
5201
|
+
banMeetingParticipant: (meetingUuid , participantUuid ) =>
|
|
5202
|
+
client.delete(
|
|
5203
|
+
`${baseUrl}/users/me/meetings/${meetingUuid}/participants/${participantUuid}`,
|
|
5204
|
+
null,
|
|
5205
|
+
null,
|
|
5206
|
+
ApiRequester.successResponseParser,
|
|
5207
|
+
),
|
|
5208
|
+
|
|
5063
5209
|
listTrunks: () => client.get(`${baseUrl}/trunks`),
|
|
5064
5210
|
|
|
5065
5211
|
mute: (callId ) =>
|
|
@@ -6208,6 +6354,24 @@ const fixSdp = (sdp , candidates , forcePort = true)
|
|
|
6208
6354
|
return fixed;
|
|
6209
6355
|
};
|
|
6210
6356
|
|
|
6357
|
+
const addIcesInAllBundles = (sdp ) => {
|
|
6358
|
+
const parsedSdp = sdpParser__default['default'].parse(sdp);
|
|
6359
|
+
|
|
6360
|
+
const mediaWithCandidate = parsedSdp.media.find(media => !!media.candidates);
|
|
6361
|
+
if (!mediaWithCandidate) {
|
|
6362
|
+
return sdp;
|
|
6363
|
+
}
|
|
6364
|
+
|
|
6365
|
+
const { candidates } = mediaWithCandidate;
|
|
6366
|
+
|
|
6367
|
+
parsedSdp.media = parsedSdp.media.map(media => ({
|
|
6368
|
+
...media,
|
|
6369
|
+
candidates: media.candidates || candidates,
|
|
6370
|
+
}));
|
|
6371
|
+
|
|
6372
|
+
return sdpParser__default['default'].write(parsedSdp);
|
|
6373
|
+
};
|
|
6374
|
+
|
|
6211
6375
|
/* global RTCSessionDescriptionInit, navigator */
|
|
6212
6376
|
|
|
6213
6377
|
const wazoLogger = IssueReporter$1 ? IssueReporter$1.loggerFor('webrtc-sdh') : console;
|
|
@@ -6337,7 +6501,10 @@ class WazoSessionDescriptionHandler extends sessionDescriptionHandler.SessionDes
|
|
|
6337
6501
|
|
|
6338
6502
|
// Check if we got ICEs
|
|
6339
6503
|
if (sdp.indexOf('a=candidate') !== -1) {
|
|
6340
|
-
return
|
|
6504
|
+
return {
|
|
6505
|
+
type: description.type,
|
|
6506
|
+
sdp: addIcesInAllBundles(sdp),
|
|
6507
|
+
};
|
|
6341
6508
|
}
|
|
6342
6509
|
|
|
6343
6510
|
wazoLogger.info('No ICE candidates found in SDP, fixing it with gathered ices', this.gatheredCandidates);
|
|
@@ -7797,41 +7964,58 @@ class WebRTCClient extends Emitter {
|
|
|
7797
7964
|
});
|
|
7798
7965
|
}
|
|
7799
7966
|
|
|
7800
|
-
changeAudioInputDevice(id , session ) {
|
|
7967
|
+
async changeAudioInputDevice(id , session , force ) {
|
|
7801
7968
|
const currentId = this.getAudioDeviceId();
|
|
7802
7969
|
logger$8.info('setting audio input device', { id, currentId, session: !!session });
|
|
7803
7970
|
|
|
7804
|
-
if (id === currentId) {
|
|
7971
|
+
if (!force && id === currentId) {
|
|
7805
7972
|
return null;
|
|
7806
7973
|
}
|
|
7807
7974
|
|
|
7975
|
+
// in order to handle an audio track change for default devices
|
|
7976
|
+
// we need the actual id of the device (not 'default')
|
|
7977
|
+
let deviceId = id;
|
|
7978
|
+
if (id === 'default' && navigator.mediaDevices) {
|
|
7979
|
+
const devices = await navigator.mediaDevices.enumerateDevices();
|
|
7980
|
+
const defaultDevice = devices.find(device => device.deviceId === 'default');
|
|
7981
|
+
if (defaultDevice) {
|
|
7982
|
+
const deviceLabel = defaultDevice.label.replace('Default - ', '');
|
|
7983
|
+
const targetDevice = devices.find(device => device.label === deviceLabel);
|
|
7984
|
+
if (targetDevice) {
|
|
7985
|
+
deviceId = targetDevice.deviceId;
|
|
7986
|
+
if (!force && deviceId === currentId) {
|
|
7987
|
+
return null;
|
|
7988
|
+
}
|
|
7989
|
+
}
|
|
7990
|
+
}
|
|
7991
|
+
}
|
|
7992
|
+
|
|
7808
7993
|
// let's update the local audio value
|
|
7809
7994
|
if (this.audio) {
|
|
7810
7995
|
this.audio = {
|
|
7811
7996
|
deviceId: {
|
|
7812
|
-
exact:
|
|
7997
|
+
exact: deviceId,
|
|
7813
7998
|
},
|
|
7814
7999
|
};
|
|
7815
8000
|
}
|
|
7816
8001
|
|
|
7817
|
-
if (session) {
|
|
8002
|
+
if (session && navigator.mediaDevices) {
|
|
7818
8003
|
const sdh = session.sessionDescriptionHandler;
|
|
7819
8004
|
const pc = sdh.peerConnection;
|
|
7820
8005
|
|
|
7821
|
-
|
|
7822
|
-
|
|
7823
|
-
|
|
7824
|
-
|
|
8006
|
+
const constraints = { audio: { deviceId: { exact: deviceId } } };
|
|
8007
|
+
const stream = await navigator.mediaDevices.getUserMedia(constraints);
|
|
8008
|
+
const audioTrack = stream.getAudioTracks()[0];
|
|
8009
|
+
const sender = pc && pc.getSenders().find(s => audioTrack && s && s.track && s.track.kind === audioTrack.kind);
|
|
7825
8010
|
|
|
7826
|
-
|
|
7827
|
-
|
|
7828
|
-
|
|
7829
|
-
}
|
|
7830
|
-
sender.replaceTrack(audioTrack);
|
|
8011
|
+
if (sender) {
|
|
8012
|
+
if (sender.track) {
|
|
8013
|
+
audioTrack.enabled = sender.track.enabled;
|
|
7831
8014
|
}
|
|
8015
|
+
sender.replaceTrack(audioTrack);
|
|
8016
|
+
}
|
|
7832
8017
|
|
|
7833
|
-
|
|
7834
|
-
});
|
|
8018
|
+
return stream;
|
|
7835
8019
|
}
|
|
7836
8020
|
}
|
|
7837
8021
|
|
|
@@ -7851,14 +8035,14 @@ class WebRTCClient extends Emitter {
|
|
|
7851
8035
|
return null;
|
|
7852
8036
|
}
|
|
7853
8037
|
|
|
7854
|
-
// let's
|
|
7855
|
-
|
|
7856
|
-
|
|
7857
|
-
|
|
7858
|
-
|
|
7859
|
-
|
|
7860
|
-
}
|
|
7861
|
-
}
|
|
8038
|
+
// let's make sure we don't lose other video constraints settings -- width, height, frameRate...
|
|
8039
|
+
const videoObject = typeof this.video === 'object' ? this.video : {};
|
|
8040
|
+
this.video = {
|
|
8041
|
+
...videoObject,
|
|
8042
|
+
deviceId: {
|
|
8043
|
+
exact: id,
|
|
8044
|
+
},
|
|
8045
|
+
};
|
|
7862
8046
|
}
|
|
7863
8047
|
|
|
7864
8048
|
changeSessionVideoInputDevice(id , session ) {
|
|
@@ -9597,10 +9781,10 @@ class WebRTCPhone extends Emitter {
|
|
|
9597
9781
|
this.audioRingVolume = volume;
|
|
9598
9782
|
}
|
|
9599
9783
|
|
|
9600
|
-
changeAudioInputDevice(id ) {
|
|
9784
|
+
changeAudioInputDevice(id , force ) {
|
|
9601
9785
|
logger$7.info('WebRTC phone - changeAudio input device', { deviceId: id });
|
|
9602
9786
|
|
|
9603
|
-
return this.client.changeAudioInputDevice(id, this.currentSipSession);
|
|
9787
|
+
return this.client.changeAudioInputDevice(id, this.currentSipSession, force);
|
|
9604
9788
|
}
|
|
9605
9789
|
|
|
9606
9790
|
changeVideoInputDevice(id ) {
|
|
@@ -11253,6 +11437,7 @@ const AGENT_UNPAUSED = 'agent_unpaused';
|
|
|
11253
11437
|
const CONFERENCE_ADHOC_PARTICIPANT_LEFT = 'conference_adhoc_participant_left';
|
|
11254
11438
|
const CONFERENCE_ADHOC_DELETED = 'conference_adhoc_deleted';
|
|
11255
11439
|
const MEETING_USER_PROGRESS = 'meeting_user_progress';
|
|
11440
|
+
const MEETING_USER_GUEST_AUTHORIZATION_CREATED = 'meeting_user_guest_authorization_created';
|
|
11256
11441
|
|
|
11257
11442
|
const BLACKLIST_EVENTS = [
|
|
11258
11443
|
CHAT_MESSAGE_SENT,
|
|
@@ -11604,6 +11789,7 @@ WebSocketClient.eventLists = [
|
|
|
11604
11789
|
CONFERENCE_ADHOC_PARTICIPANT_LEFT,
|
|
11605
11790
|
CONFERENCE_ADHOC_DELETED,
|
|
11606
11791
|
MEETING_USER_PROGRESS,
|
|
11792
|
+
MEETING_USER_GUEST_AUTHORIZATION_CREATED,
|
|
11607
11793
|
];
|
|
11608
11794
|
|
|
11609
11795
|
var WebSocketClient$1 = /*#__PURE__*/Object.freeze({
|
|
@@ -11675,6 +11861,7 @@ var WebSocketClient$1 = /*#__PURE__*/Object.freeze({
|
|
|
11675
11861
|
CONFERENCE_ADHOC_PARTICIPANT_LEFT: CONFERENCE_ADHOC_PARTICIPANT_LEFT,
|
|
11676
11862
|
CONFERENCE_ADHOC_DELETED: CONFERENCE_ADHOC_DELETED,
|
|
11677
11863
|
MEETING_USER_PROGRESS: MEETING_USER_PROGRESS,
|
|
11864
|
+
MEETING_USER_GUEST_AUTHORIZATION_CREATED: MEETING_USER_GUEST_AUTHORIZATION_CREATED,
|
|
11678
11865
|
HEARTBEAT_ENGINE_VERSION: HEARTBEAT_ENGINE_VERSION,
|
|
11679
11866
|
'default': WebSocketClient
|
|
11680
11867
|
});
|
|
@@ -11772,7 +11959,7 @@ class SipRoom extends Room {
|
|
|
11772
11959
|
logger$3.info('connecting to sip room', { extension, audioOnly, room: !!room });
|
|
11773
11960
|
|
|
11774
11961
|
if (!room) {
|
|
11775
|
-
await Wazo.Phone.connect();
|
|
11962
|
+
await Wazo.Phone.connect({ media: constraints });
|
|
11776
11963
|
|
|
11777
11964
|
const withCamera = constraints && !!constraints.video;
|
|
11778
11965
|
|
|
@@ -13459,7 +13646,7 @@ class Room extends Emitter {
|
|
|
13459
13646
|
logger$1.info('connecting to room', { extension, audioOnly, room: !!room });
|
|
13460
13647
|
|
|
13461
13648
|
if (!room) {
|
|
13462
|
-
await Wazo.Phone.connect();
|
|
13649
|
+
await Wazo.Phone.connect({ media: constraints });
|
|
13463
13650
|
|
|
13464
13651
|
const withCamera = constraints && !!constraints.video;
|
|
13465
13652
|
|
|
@@ -13904,7 +14091,7 @@ class Room extends Emitter {
|
|
|
13904
14091
|
const participant = this._getParticipantFromCallId(status.callId);
|
|
13905
14092
|
|
|
13906
14093
|
if (participant) {
|
|
13907
|
-
// we're
|
|
14094
|
+
// we're receiving, so no need to broadcast
|
|
13908
14095
|
participant.updateStatus(status, false);
|
|
13909
14096
|
}
|
|
13910
14097
|
break;
|
|
@@ -14178,6 +14365,7 @@ class Participant extends Emitter {
|
|
|
14178
14365
|
|
|
14179
14366
|
|
|
14180
14367
|
|
|
14368
|
+
|
|
14181
14369
|
|
|
14182
14370
|
|
|
14183
14371
|
|
|
@@ -14195,6 +14383,7 @@ class Participant extends Emitter {
|
|
|
14195
14383
|
|
|
14196
14384
|
|
|
14197
14385
|
|
|
14386
|
+
|
|
14198
14387
|
|
|
14199
14388
|
/**
|
|
14200
14389
|
* @param room Room The room where the participant is
|
|
@@ -14218,6 +14407,7 @@ class Participant extends Emitter {
|
|
|
14218
14407
|
this.screensharing = false;
|
|
14219
14408
|
this.isOnHold = false;
|
|
14220
14409
|
this.extra = extra;
|
|
14410
|
+
this.banned = false;
|
|
14221
14411
|
|
|
14222
14412
|
this.ON_UPDATED = 'participant/ON_UPDATED';
|
|
14223
14413
|
this.ON_START_TALKING = 'participant/ON_START_TALKING';
|
|
@@ -14234,6 +14424,7 @@ class Participant extends Emitter {
|
|
|
14234
14424
|
this.ON_EXTRA_CHANGE = 'participant/ON_EXTRA_CHANGE';
|
|
14235
14425
|
this.ON_HOLD = 'participant/ON_HOLD';
|
|
14236
14426
|
this.ON_RESUME = 'participant/ON_RESUME';
|
|
14427
|
+
this.ON_BAN = 'participant/ON_BAN';
|
|
14237
14428
|
}
|
|
14238
14429
|
|
|
14239
14430
|
triggerEvent(name , ...args ) {
|
|
@@ -14274,6 +14465,10 @@ class Participant extends Emitter {
|
|
|
14274
14465
|
status.extra = this.extra;
|
|
14275
14466
|
break;
|
|
14276
14467
|
}
|
|
14468
|
+
case this.ON_BAN: {
|
|
14469
|
+
status.banned = true;
|
|
14470
|
+
break;
|
|
14471
|
+
}
|
|
14277
14472
|
}
|
|
14278
14473
|
|
|
14279
14474
|
if (broadcast) {
|
|
@@ -14376,6 +14571,11 @@ class Participant extends Emitter {
|
|
|
14376
14571
|
this.triggerUpdate(this.ON_RESUME, broadcast);
|
|
14377
14572
|
}
|
|
14378
14573
|
|
|
14574
|
+
onBan(broadcast = true) {
|
|
14575
|
+
this.banned = true;
|
|
14576
|
+
this.triggerUpdate(this.ON_BAN, broadcast);
|
|
14577
|
+
}
|
|
14578
|
+
|
|
14379
14579
|
getStatus() {
|
|
14380
14580
|
return {
|
|
14381
14581
|
callId: this.callId,
|
|
@@ -14422,6 +14622,10 @@ class Participant extends Emitter {
|
|
|
14422
14622
|
}
|
|
14423
14623
|
}
|
|
14424
14624
|
|
|
14625
|
+
if (status.banned) {
|
|
14626
|
+
this.onBan(false);
|
|
14627
|
+
}
|
|
14628
|
+
|
|
14425
14629
|
// Poor man's object comparison
|
|
14426
14630
|
if (typeof status.extra !== 'undefined' && JSON.stringify(this.extra) !== JSON.stringify(status.extra)) {
|
|
14427
14631
|
this.extra = { ...this.extra, ...status.extra };
|
|
@@ -14449,6 +14653,28 @@ class Participant extends Emitter {
|
|
|
14449
14653
|
this.streams = streams;
|
|
14450
14654
|
this.videoStreams = streams;
|
|
14451
14655
|
}
|
|
14656
|
+
|
|
14657
|
+
async ban(apiRequestDelay = null) {
|
|
14658
|
+
const { meetingUuid } = this.room;
|
|
14659
|
+
if (!meetingUuid) {
|
|
14660
|
+
throw new Error('Attempting to ban a participant without a `meetingUuid`');
|
|
14661
|
+
}
|
|
14662
|
+
|
|
14663
|
+
// this notifies all that someone is being banned
|
|
14664
|
+
this.onBan(true);
|
|
14665
|
+
|
|
14666
|
+
// this allows to delay the actual ban, in order for the banned participant as well as others to react to the situation
|
|
14667
|
+
if (apiRequestDelay) {
|
|
14668
|
+
await this.delay(apiRequestDelay);
|
|
14669
|
+
}
|
|
14670
|
+
|
|
14671
|
+
// proceed with the actual kick
|
|
14672
|
+
return getApiClient().calld.banMeetingParticipant(meetingUuid, this.callId);
|
|
14673
|
+
}
|
|
14674
|
+
|
|
14675
|
+
async delay(ms ) {
|
|
14676
|
+
return new Promise(resolve => setTimeout(resolve, ms));
|
|
14677
|
+
}
|
|
14452
14678
|
}
|
|
14453
14679
|
|
|
14454
14680
|
module.exports = Participant;
|