@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/index.js
CHANGED
|
@@ -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
|
});
|
|
@@ -11779,6 +11966,7 @@ class Participant extends Emitter {
|
|
|
11779
11966
|
|
|
11780
11967
|
|
|
11781
11968
|
|
|
11969
|
+
|
|
11782
11970
|
|
|
11783
11971
|
|
|
11784
11972
|
|
|
@@ -11796,6 +11984,7 @@ class Participant extends Emitter {
|
|
|
11796
11984
|
|
|
11797
11985
|
|
|
11798
11986
|
|
|
11987
|
+
|
|
11799
11988
|
|
|
11800
11989
|
/**
|
|
11801
11990
|
* @param room Room The room where the participant is
|
|
@@ -11819,6 +12008,7 @@ class Participant extends Emitter {
|
|
|
11819
12008
|
this.screensharing = false;
|
|
11820
12009
|
this.isOnHold = false;
|
|
11821
12010
|
this.extra = extra;
|
|
12011
|
+
this.banned = false;
|
|
11822
12012
|
|
|
11823
12013
|
this.ON_UPDATED = 'participant/ON_UPDATED';
|
|
11824
12014
|
this.ON_START_TALKING = 'participant/ON_START_TALKING';
|
|
@@ -11835,6 +12025,7 @@ class Participant extends Emitter {
|
|
|
11835
12025
|
this.ON_EXTRA_CHANGE = 'participant/ON_EXTRA_CHANGE';
|
|
11836
12026
|
this.ON_HOLD = 'participant/ON_HOLD';
|
|
11837
12027
|
this.ON_RESUME = 'participant/ON_RESUME';
|
|
12028
|
+
this.ON_BAN = 'participant/ON_BAN';
|
|
11838
12029
|
}
|
|
11839
12030
|
|
|
11840
12031
|
triggerEvent(name , ...args ) {
|
|
@@ -11875,6 +12066,10 @@ class Participant extends Emitter {
|
|
|
11875
12066
|
status.extra = this.extra;
|
|
11876
12067
|
break;
|
|
11877
12068
|
}
|
|
12069
|
+
case this.ON_BAN: {
|
|
12070
|
+
status.banned = true;
|
|
12071
|
+
break;
|
|
12072
|
+
}
|
|
11878
12073
|
}
|
|
11879
12074
|
|
|
11880
12075
|
if (broadcast) {
|
|
@@ -11977,6 +12172,11 @@ class Participant extends Emitter {
|
|
|
11977
12172
|
this.triggerUpdate(this.ON_RESUME, broadcast);
|
|
11978
12173
|
}
|
|
11979
12174
|
|
|
12175
|
+
onBan(broadcast = true) {
|
|
12176
|
+
this.banned = true;
|
|
12177
|
+
this.triggerUpdate(this.ON_BAN, broadcast);
|
|
12178
|
+
}
|
|
12179
|
+
|
|
11980
12180
|
getStatus() {
|
|
11981
12181
|
return {
|
|
11982
12182
|
callId: this.callId,
|
|
@@ -12023,6 +12223,10 @@ class Participant extends Emitter {
|
|
|
12023
12223
|
}
|
|
12024
12224
|
}
|
|
12025
12225
|
|
|
12226
|
+
if (status.banned) {
|
|
12227
|
+
this.onBan(false);
|
|
12228
|
+
}
|
|
12229
|
+
|
|
12026
12230
|
// Poor man's object comparison
|
|
12027
12231
|
if (typeof status.extra !== 'undefined' && JSON.stringify(this.extra) !== JSON.stringify(status.extra)) {
|
|
12028
12232
|
this.extra = { ...this.extra, ...status.extra };
|
|
@@ -12050,6 +12254,28 @@ class Participant extends Emitter {
|
|
|
12050
12254
|
this.streams = streams;
|
|
12051
12255
|
this.videoStreams = streams;
|
|
12052
12256
|
}
|
|
12257
|
+
|
|
12258
|
+
async ban(apiRequestDelay = null) {
|
|
12259
|
+
const { meetingUuid } = this.room;
|
|
12260
|
+
if (!meetingUuid) {
|
|
12261
|
+
throw new Error('Attempting to ban a participant without a `meetingUuid`');
|
|
12262
|
+
}
|
|
12263
|
+
|
|
12264
|
+
// this notifies all that someone is being banned
|
|
12265
|
+
this.onBan(true);
|
|
12266
|
+
|
|
12267
|
+
// this allows to delay the actual ban, in order for the banned participant as well as others to react to the situation
|
|
12268
|
+
if (apiRequestDelay) {
|
|
12269
|
+
await this.delay(apiRequestDelay);
|
|
12270
|
+
}
|
|
12271
|
+
|
|
12272
|
+
// proceed with the actual kick
|
|
12273
|
+
return getApiClient().calld.banMeetingParticipant(meetingUuid, this.callId);
|
|
12274
|
+
}
|
|
12275
|
+
|
|
12276
|
+
async delay(ms ) {
|
|
12277
|
+
return new Promise(resolve => setTimeout(resolve, ms));
|
|
12278
|
+
}
|
|
12053
12279
|
}
|
|
12054
12280
|
|
|
12055
12281
|
//
|
|
@@ -12202,7 +12428,7 @@ class Room$1 extends Emitter {
|
|
|
12202
12428
|
logger$2.info('connecting to room', { extension, audioOnly, room: !!room });
|
|
12203
12429
|
|
|
12204
12430
|
if (!room) {
|
|
12205
|
-
await Wazo.Phone.connect();
|
|
12431
|
+
await Wazo.Phone.connect({ media: constraints });
|
|
12206
12432
|
|
|
12207
12433
|
const withCamera = constraints && !!constraints.video;
|
|
12208
12434
|
|
|
@@ -12647,7 +12873,7 @@ class Room$1 extends Emitter {
|
|
|
12647
12873
|
const participant = this._getParticipantFromCallId(status.callId);
|
|
12648
12874
|
|
|
12649
12875
|
if (participant) {
|
|
12650
|
-
// we're
|
|
12876
|
+
// we're receiving, so no need to broadcast
|
|
12651
12877
|
participant.updateStatus(status, false);
|
|
12652
12878
|
}
|
|
12653
12879
|
break;
|
|
@@ -12914,7 +13140,7 @@ class SipRoom extends Room$1 {
|
|
|
12914
13140
|
logger$1.info('connecting to sip room', { extension, audioOnly, room: !!room });
|
|
12915
13141
|
|
|
12916
13142
|
if (!room) {
|
|
12917
|
-
await Wazo.Phone.connect();
|
|
13143
|
+
await Wazo.Phone.connect({ media: constraints });
|
|
12918
13144
|
|
|
12919
13145
|
const withCamera = constraints && !!constraints.video;
|
|
12920
13146
|
|