@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/esm/simple/Auth.js
CHANGED
|
@@ -2645,6 +2645,70 @@ class ExternalApp {
|
|
|
2645
2645
|
|
|
2646
2646
|
//
|
|
2647
2647
|
|
|
2648
|
+
class MeetingAuthorization {
|
|
2649
|
+
|
|
2650
|
+
|
|
2651
|
+
|
|
2652
|
+
|
|
2653
|
+
|
|
2654
|
+
|
|
2655
|
+
constructor({
|
|
2656
|
+
meetingUuid,
|
|
2657
|
+
uuid,
|
|
2658
|
+
userUuid,
|
|
2659
|
+
userName,
|
|
2660
|
+
} = {}) {
|
|
2661
|
+
this.meetingUuid = meetingUuid;
|
|
2662
|
+
this.uuid = uuid;
|
|
2663
|
+
this.userUuid = userUuid;
|
|
2664
|
+
this.userName = userName;
|
|
2665
|
+
}
|
|
2666
|
+
|
|
2667
|
+
setStatus(status ) {
|
|
2668
|
+
this.status = status;
|
|
2669
|
+
}
|
|
2670
|
+
|
|
2671
|
+
getStatus() {
|
|
2672
|
+
return this.status;
|
|
2673
|
+
}
|
|
2674
|
+
|
|
2675
|
+
static parse(plain ) {
|
|
2676
|
+
const {
|
|
2677
|
+
meeting_uuid: meetingUuid,
|
|
2678
|
+
uuid,
|
|
2679
|
+
guest_uuid: userUuid,
|
|
2680
|
+
guest_name: userName,
|
|
2681
|
+
} = plain;
|
|
2682
|
+
|
|
2683
|
+
return new MeetingAuthorization({
|
|
2684
|
+
meetingUuid,
|
|
2685
|
+
uuid,
|
|
2686
|
+
userUuid,
|
|
2687
|
+
userName,
|
|
2688
|
+
});
|
|
2689
|
+
}
|
|
2690
|
+
|
|
2691
|
+
static parseMany(items ) {
|
|
2692
|
+
if (!items) {
|
|
2693
|
+
return [];
|
|
2694
|
+
}
|
|
2695
|
+
return items.map(MeetingAuthorization.parse);
|
|
2696
|
+
}
|
|
2697
|
+
}
|
|
2698
|
+
|
|
2699
|
+
//
|
|
2700
|
+
|
|
2701
|
+
|
|
2702
|
+
|
|
2703
|
+
|
|
2704
|
+
|
|
2705
|
+
|
|
2706
|
+
|
|
2707
|
+
|
|
2708
|
+
|
|
2709
|
+
|
|
2710
|
+
|
|
2711
|
+
|
|
2648
2712
|
|
|
2649
2713
|
|
|
2650
2714
|
|
|
@@ -2655,6 +2719,7 @@ class ExternalApp {
|
|
|
2655
2719
|
|
|
2656
2720
|
|
|
2657
2721
|
|
|
2722
|
+
|
|
2658
2723
|
|
|
2659
2724
|
|
|
2660
2725
|
class Meeting {
|
|
@@ -2669,6 +2734,8 @@ class Meeting {
|
|
|
2669
2734
|
|
|
2670
2735
|
|
|
2671
2736
|
|
|
2737
|
+
|
|
2738
|
+
|
|
2672
2739
|
|
|
2673
2740
|
static parse(plain ) {
|
|
2674
2741
|
return new Meeting({
|
|
@@ -2681,6 +2748,7 @@ class Meeting {
|
|
|
2681
2748
|
extension: plain.exten,
|
|
2682
2749
|
persistent: plain.persistent,
|
|
2683
2750
|
creationTime: moment(plain.creation_time).toDate(),
|
|
2751
|
+
requireAuthorization: plain.require_authorization,
|
|
2684
2752
|
});
|
|
2685
2753
|
}
|
|
2686
2754
|
|
|
@@ -2705,6 +2773,7 @@ class Meeting {
|
|
|
2705
2773
|
extension,
|
|
2706
2774
|
persistent,
|
|
2707
2775
|
creationTime,
|
|
2776
|
+
requireAuthorization,
|
|
2708
2777
|
} = {}) {
|
|
2709
2778
|
this.guestSipAuthorization = guestSipAuthorization;
|
|
2710
2779
|
this.uri = uri;
|
|
@@ -2715,6 +2784,7 @@ class Meeting {
|
|
|
2715
2784
|
this.extension = extension;
|
|
2716
2785
|
this.persistent = persistent;
|
|
2717
2786
|
this.creationTime = creationTime;
|
|
2787
|
+
this.requireAuthorization = requireAuthorization;
|
|
2718
2788
|
|
|
2719
2789
|
// Useful to compare instead of instanceof with minified code
|
|
2720
2790
|
this.type = 'Meeting';
|
|
@@ -2725,8 +2795,32 @@ class Meeting {
|
|
|
2725
2795
|
const [username, secret] = atob(this.guestSipAuthorization).split(':');
|
|
2726
2796
|
return { username, secret };
|
|
2727
2797
|
}
|
|
2798
|
+
|
|
2728
2799
|
}
|
|
2729
2800
|
|
|
2801
|
+
//
|
|
2802
|
+
|
|
2803
|
+
const camelToUnderscore = (key ) => {
|
|
2804
|
+
if (typeof key !== 'string') {
|
|
2805
|
+
throw new Error('Input is not a string');
|
|
2806
|
+
}
|
|
2807
|
+
return key.charAt(0).toLowerCase() + key.substring(1).replace(/([A-Z])/g, '_$1').toLowerCase();
|
|
2808
|
+
};
|
|
2809
|
+
|
|
2810
|
+
//
|
|
2811
|
+
|
|
2812
|
+
const convertKeysFromCamelToUnderscore = (args ) => {
|
|
2813
|
+
if (!args || typeof args !== 'object' || Array.isArray(args)) {
|
|
2814
|
+
throw new Error('Input is not an object');
|
|
2815
|
+
}
|
|
2816
|
+
|
|
2817
|
+
return Object.keys(args).reduce((acc, key) => {
|
|
2818
|
+
acc[camelToUnderscore(key)] = typeof args[key] === 'object' && !Array.isArray(args[key])
|
|
2819
|
+
? convertKeysFromCamelToUnderscore(args[key]) : args[key];
|
|
2820
|
+
return acc;
|
|
2821
|
+
}, {});
|
|
2822
|
+
};
|
|
2823
|
+
|
|
2730
2824
|
/* */
|
|
2731
2825
|
|
|
2732
2826
|
var confdMethods = (client , baseUrl ) => ({
|
|
@@ -2795,8 +2889,18 @@ var confdMethods = (client , baseUrl ) => ({
|
|
|
2795
2889
|
getMyMeetings: () =>
|
|
2796
2890
|
client.get(`${baseUrl}/users/me/meetings`).then(response => Meeting.parseMany(response.items)),
|
|
2797
2891
|
|
|
2798
|
-
createMyMeeting: (
|
|
2799
|
-
client
|
|
2892
|
+
createMyMeeting: (args ) =>
|
|
2893
|
+
client
|
|
2894
|
+
.post(`${baseUrl}/users/me/meetings`, convertKeysFromCamelToUnderscore(args))
|
|
2895
|
+
.then(Meeting.parse),
|
|
2896
|
+
|
|
2897
|
+
updateMyMeeting: (meetingUuid , data ) =>
|
|
2898
|
+
client.put(
|
|
2899
|
+
`${baseUrl}/users/me/meetings/${meetingUuid}`,
|
|
2900
|
+
convertKeysFromCamelToUnderscore(data),
|
|
2901
|
+
null,
|
|
2902
|
+
ApiRequester.successResponseParser,
|
|
2903
|
+
),
|
|
2800
2904
|
|
|
2801
2905
|
deleteMyMeeting: (meetingUuid ) =>
|
|
2802
2906
|
client.delete(`${baseUrl}/users/me/meetings/${meetingUuid}`, null),
|
|
@@ -2804,8 +2908,36 @@ var confdMethods = (client , baseUrl ) => ({
|
|
|
2804
2908
|
getMeeting: (meetingUuid ) =>
|
|
2805
2909
|
client.get(`${baseUrl}/meetings/${meetingUuid}`, null).then(Meeting.parse),
|
|
2806
2910
|
|
|
2911
|
+
meetingAuthorizations: (meetingUuid ) =>
|
|
2912
|
+
client.get(`${baseUrl}/users/me/meetings/${meetingUuid}/authorizations`, null).then(MeetingAuthorization.parseMany),
|
|
2913
|
+
|
|
2914
|
+
meetingAuthorizationReject: (meetingUuid , authorizationUuid ) =>
|
|
2915
|
+
client.put(
|
|
2916
|
+
`${baseUrl}/users/me/meetings/${meetingUuid}/authorizations/${authorizationUuid}/reject`,
|
|
2917
|
+
{},
|
|
2918
|
+
null,
|
|
2919
|
+
ApiRequester.successResponseParser,
|
|
2920
|
+
),
|
|
2921
|
+
|
|
2922
|
+
meetingAuthorizationAccept: (meetingUuid , authorizationUuid ) =>
|
|
2923
|
+
client.put(
|
|
2924
|
+
`${baseUrl}/users/me/meetings/${meetingUuid}/authorizations/${authorizationUuid}/accept`,
|
|
2925
|
+
{},
|
|
2926
|
+
null,
|
|
2927
|
+
ApiRequester.successResponseParser,
|
|
2928
|
+
),
|
|
2929
|
+
|
|
2807
2930
|
guestGetMeeting: (meetingUuid ) =>
|
|
2808
2931
|
client.get(`${baseUrl}/guests/me/meetings/${meetingUuid}`, null).then(Meeting.parse),
|
|
2932
|
+
|
|
2933
|
+
guestAuthorizationRequest: (userUuid , meetingUuid , username ) =>
|
|
2934
|
+
client
|
|
2935
|
+
.post(`${baseUrl}/guests/${userUuid}/meetings/${meetingUuid}/authorizations`, { guest_name: username })
|
|
2936
|
+
.then(MeetingAuthorization.parse),
|
|
2937
|
+
|
|
2938
|
+
guestAuthorizationCheck: (userUuid , meetingUuid , authorizationUuid ) =>
|
|
2939
|
+
client.get(`${baseUrl}/guests/${userUuid}/meetings/${meetingUuid}/authorizations/${authorizationUuid}`, null),
|
|
2940
|
+
|
|
2809
2941
|
});
|
|
2810
2942
|
|
|
2811
2943
|
//
|
|
@@ -3071,6 +3203,7 @@ const RECORD_STATE_ACTIVE = 'active';
|
|
|
3071
3203
|
|
|
3072
3204
|
|
|
3073
3205
|
|
|
3206
|
+
|
|
3074
3207
|
|
|
3075
3208
|
|
|
3076
3209
|
|
|
@@ -3081,6 +3214,7 @@ const RECORD_STATE_ACTIVE = 'active';
|
|
|
3081
3214
|
|
|
3082
3215
|
|
|
3083
3216
|
|
|
3217
|
+
|
|
3084
3218
|
|
|
3085
3219
|
|
|
3086
3220
|
|
|
@@ -3109,6 +3243,7 @@ class Call {
|
|
|
3109
3243
|
|
|
3110
3244
|
|
|
3111
3245
|
|
|
3246
|
+
|
|
3112
3247
|
|
|
3113
3248
|
|
|
3114
3249
|
|
|
@@ -3133,6 +3268,7 @@ class Call {
|
|
|
3133
3268
|
calleeNumber: plain.peer_caller_id_number,
|
|
3134
3269
|
dialedExtension: plain.dialed_extension,
|
|
3135
3270
|
isCaller: plain.is_caller,
|
|
3271
|
+
isVideo: plain.is_video,
|
|
3136
3272
|
muted: plain.muted,
|
|
3137
3273
|
onHold: plain.on_hold,
|
|
3138
3274
|
status: plain.status,
|
|
@@ -3156,6 +3292,7 @@ class Call {
|
|
|
3156
3292
|
calleeNumber,
|
|
3157
3293
|
dialedExtension,
|
|
3158
3294
|
isCaller,
|
|
3295
|
+
isVideo,
|
|
3159
3296
|
lineId,
|
|
3160
3297
|
muted,
|
|
3161
3298
|
onHold,
|
|
@@ -3179,6 +3316,7 @@ class Call {
|
|
|
3179
3316
|
this.startingTime = startingTime;
|
|
3180
3317
|
this.talkingToIds = talkingToIds || [];
|
|
3181
3318
|
this.recording = recording;
|
|
3319
|
+
this.isVideo = !!isVideo;
|
|
3182
3320
|
|
|
3183
3321
|
// Useful to compare instead of instanceof with minified code
|
|
3184
3322
|
this.type = 'Call';
|
|
@@ -3652,7 +3790,7 @@ class CallSession {
|
|
|
3652
3790
|
ringing: call.isRinging(),
|
|
3653
3791
|
answered: call.isUp(),
|
|
3654
3792
|
answeredBySystem: call.isUp() && call.talkingToIds.length === 0,
|
|
3655
|
-
cameraEnabled:
|
|
3793
|
+
cameraEnabled: call.isVideo,
|
|
3656
3794
|
dialedExtension: call.dialedExtension,
|
|
3657
3795
|
call,
|
|
3658
3796
|
conference: false, // @FIXME?
|
|
@@ -5050,6 +5188,14 @@ var calldMethods = (client , baseUrl ) => ({
|
|
|
5050
5188
|
getMeetingParticipantsAsUser: async (meetingUuid ) =>
|
|
5051
5189
|
client.get(`${baseUrl}/users/me/meetings/${meetingUuid}/participants`),
|
|
5052
5190
|
|
|
5191
|
+
banMeetingParticipant: (meetingUuid , participantUuid ) =>
|
|
5192
|
+
client.delete(
|
|
5193
|
+
`${baseUrl}/users/me/meetings/${meetingUuid}/participants/${participantUuid}`,
|
|
5194
|
+
null,
|
|
5195
|
+
null,
|
|
5196
|
+
ApiRequester.successResponseParser,
|
|
5197
|
+
),
|
|
5198
|
+
|
|
5053
5199
|
listTrunks: () => client.get(`${baseUrl}/trunks`),
|
|
5054
5200
|
|
|
5055
5201
|
mute: (callId ) =>
|
|
@@ -5897,6 +6043,24 @@ const fixSdp = (sdp , candidates , forcePort = true)
|
|
|
5897
6043
|
return fixed;
|
|
5898
6044
|
};
|
|
5899
6045
|
|
|
6046
|
+
const addIcesInAllBundles = (sdp ) => {
|
|
6047
|
+
const parsedSdp = sdpParser.parse(sdp);
|
|
6048
|
+
|
|
6049
|
+
const mediaWithCandidate = parsedSdp.media.find(media => !!media.candidates);
|
|
6050
|
+
if (!mediaWithCandidate) {
|
|
6051
|
+
return sdp;
|
|
6052
|
+
}
|
|
6053
|
+
|
|
6054
|
+
const { candidates } = mediaWithCandidate;
|
|
6055
|
+
|
|
6056
|
+
parsedSdp.media = parsedSdp.media.map(media => ({
|
|
6057
|
+
...media,
|
|
6058
|
+
candidates: media.candidates || candidates,
|
|
6059
|
+
}));
|
|
6060
|
+
|
|
6061
|
+
return sdpParser.write(parsedSdp);
|
|
6062
|
+
};
|
|
6063
|
+
|
|
5900
6064
|
/* global RTCSessionDescriptionInit, navigator */
|
|
5901
6065
|
|
|
5902
6066
|
const wazoLogger = IssueReporter$1 ? IssueReporter$1.loggerFor('webrtc-sdh') : console;
|
|
@@ -6026,7 +6190,10 @@ class WazoSessionDescriptionHandler extends SessionDescriptionHandler {
|
|
|
6026
6190
|
|
|
6027
6191
|
// Check if we got ICEs
|
|
6028
6192
|
if (sdp.indexOf('a=candidate') !== -1) {
|
|
6029
|
-
return
|
|
6193
|
+
return {
|
|
6194
|
+
type: description.type,
|
|
6195
|
+
sdp: addIcesInAllBundles(sdp),
|
|
6196
|
+
};
|
|
6030
6197
|
}
|
|
6031
6198
|
|
|
6032
6199
|
wazoLogger.info('No ICE candidates found in SDP, fixing it with gathered ices', this.gatheredCandidates);
|
|
@@ -7486,41 +7653,58 @@ class WebRTCClient extends Emitter {
|
|
|
7486
7653
|
});
|
|
7487
7654
|
}
|
|
7488
7655
|
|
|
7489
|
-
changeAudioInputDevice(id , session ) {
|
|
7656
|
+
async changeAudioInputDevice(id , session , force ) {
|
|
7490
7657
|
const currentId = this.getAudioDeviceId();
|
|
7491
7658
|
logger$9.info('setting audio input device', { id, currentId, session: !!session });
|
|
7492
7659
|
|
|
7493
|
-
if (id === currentId) {
|
|
7660
|
+
if (!force && id === currentId) {
|
|
7494
7661
|
return null;
|
|
7495
7662
|
}
|
|
7496
7663
|
|
|
7664
|
+
// in order to handle an audio track change for default devices
|
|
7665
|
+
// we need the actual id of the device (not 'default')
|
|
7666
|
+
let deviceId = id;
|
|
7667
|
+
if (id === 'default' && navigator.mediaDevices) {
|
|
7668
|
+
const devices = await navigator.mediaDevices.enumerateDevices();
|
|
7669
|
+
const defaultDevice = devices.find(device => device.deviceId === 'default');
|
|
7670
|
+
if (defaultDevice) {
|
|
7671
|
+
const deviceLabel = defaultDevice.label.replace('Default - ', '');
|
|
7672
|
+
const targetDevice = devices.find(device => device.label === deviceLabel);
|
|
7673
|
+
if (targetDevice) {
|
|
7674
|
+
deviceId = targetDevice.deviceId;
|
|
7675
|
+
if (!force && deviceId === currentId) {
|
|
7676
|
+
return null;
|
|
7677
|
+
}
|
|
7678
|
+
}
|
|
7679
|
+
}
|
|
7680
|
+
}
|
|
7681
|
+
|
|
7497
7682
|
// let's update the local audio value
|
|
7498
7683
|
if (this.audio) {
|
|
7499
7684
|
this.audio = {
|
|
7500
7685
|
deviceId: {
|
|
7501
|
-
exact:
|
|
7686
|
+
exact: deviceId,
|
|
7502
7687
|
},
|
|
7503
7688
|
};
|
|
7504
7689
|
}
|
|
7505
7690
|
|
|
7506
|
-
if (session) {
|
|
7691
|
+
if (session && navigator.mediaDevices) {
|
|
7507
7692
|
const sdh = session.sessionDescriptionHandler;
|
|
7508
7693
|
const pc = sdh.peerConnection;
|
|
7509
7694
|
|
|
7510
|
-
|
|
7511
|
-
|
|
7512
|
-
|
|
7513
|
-
|
|
7695
|
+
const constraints = { audio: { deviceId: { exact: deviceId } } };
|
|
7696
|
+
const stream = await navigator.mediaDevices.getUserMedia(constraints);
|
|
7697
|
+
const audioTrack = stream.getAudioTracks()[0];
|
|
7698
|
+
const sender = pc && pc.getSenders().find(s => audioTrack && s && s.track && s.track.kind === audioTrack.kind);
|
|
7514
7699
|
|
|
7515
|
-
|
|
7516
|
-
|
|
7517
|
-
|
|
7518
|
-
}
|
|
7519
|
-
sender.replaceTrack(audioTrack);
|
|
7700
|
+
if (sender) {
|
|
7701
|
+
if (sender.track) {
|
|
7702
|
+
audioTrack.enabled = sender.track.enabled;
|
|
7520
7703
|
}
|
|
7704
|
+
sender.replaceTrack(audioTrack);
|
|
7705
|
+
}
|
|
7521
7706
|
|
|
7522
|
-
|
|
7523
|
-
});
|
|
7707
|
+
return stream;
|
|
7524
7708
|
}
|
|
7525
7709
|
}
|
|
7526
7710
|
|
|
@@ -7540,14 +7724,14 @@ class WebRTCClient extends Emitter {
|
|
|
7540
7724
|
return null;
|
|
7541
7725
|
}
|
|
7542
7726
|
|
|
7543
|
-
// let's
|
|
7544
|
-
|
|
7545
|
-
|
|
7546
|
-
|
|
7547
|
-
|
|
7548
|
-
|
|
7549
|
-
}
|
|
7550
|
-
}
|
|
7727
|
+
// let's make sure we don't lose other video constraints settings -- width, height, frameRate...
|
|
7728
|
+
const videoObject = typeof this.video === 'object' ? this.video : {};
|
|
7729
|
+
this.video = {
|
|
7730
|
+
...videoObject,
|
|
7731
|
+
deviceId: {
|
|
7732
|
+
exact: id,
|
|
7733
|
+
},
|
|
7734
|
+
};
|
|
7551
7735
|
}
|
|
7552
7736
|
|
|
7553
7737
|
changeSessionVideoInputDevice(id , session ) {
|
|
@@ -9286,10 +9470,10 @@ class WebRTCPhone extends Emitter {
|
|
|
9286
9470
|
this.audioRingVolume = volume;
|
|
9287
9471
|
}
|
|
9288
9472
|
|
|
9289
|
-
changeAudioInputDevice(id ) {
|
|
9473
|
+
changeAudioInputDevice(id , force ) {
|
|
9290
9474
|
logger$8.info('WebRTC phone - changeAudio input device', { deviceId: id });
|
|
9291
9475
|
|
|
9292
|
-
return this.client.changeAudioInputDevice(id, this.currentSipSession);
|
|
9476
|
+
return this.client.changeAudioInputDevice(id, this.currentSipSession, force);
|
|
9293
9477
|
}
|
|
9294
9478
|
|
|
9295
9479
|
changeVideoInputDevice(id ) {
|
|
@@ -10942,6 +11126,7 @@ const AGENT_UNPAUSED = 'agent_unpaused';
|
|
|
10942
11126
|
const CONFERENCE_ADHOC_PARTICIPANT_LEFT = 'conference_adhoc_participant_left';
|
|
10943
11127
|
const CONFERENCE_ADHOC_DELETED = 'conference_adhoc_deleted';
|
|
10944
11128
|
const MEETING_USER_PROGRESS = 'meeting_user_progress';
|
|
11129
|
+
const MEETING_USER_GUEST_AUTHORIZATION_CREATED = 'meeting_user_guest_authorization_created';
|
|
10945
11130
|
|
|
10946
11131
|
const BLACKLIST_EVENTS = [
|
|
10947
11132
|
CHAT_MESSAGE_SENT,
|
|
@@ -11293,6 +11478,7 @@ WebSocketClient.eventLists = [
|
|
|
11293
11478
|
CONFERENCE_ADHOC_PARTICIPANT_LEFT,
|
|
11294
11479
|
CONFERENCE_ADHOC_DELETED,
|
|
11295
11480
|
MEETING_USER_PROGRESS,
|
|
11481
|
+
MEETING_USER_GUEST_AUTHORIZATION_CREATED,
|
|
11296
11482
|
];
|
|
11297
11483
|
|
|
11298
11484
|
var WebSocketClient$1 = /*#__PURE__*/Object.freeze({
|
|
@@ -11364,6 +11550,7 @@ var WebSocketClient$1 = /*#__PURE__*/Object.freeze({
|
|
|
11364
11550
|
CONFERENCE_ADHOC_PARTICIPANT_LEFT: CONFERENCE_ADHOC_PARTICIPANT_LEFT,
|
|
11365
11551
|
CONFERENCE_ADHOC_DELETED: CONFERENCE_ADHOC_DELETED,
|
|
11366
11552
|
MEETING_USER_PROGRESS: MEETING_USER_PROGRESS,
|
|
11553
|
+
MEETING_USER_GUEST_AUTHORIZATION_CREATED: MEETING_USER_GUEST_AUTHORIZATION_CREATED,
|
|
11367
11554
|
HEARTBEAT_ENGINE_VERSION: HEARTBEAT_ENGINE_VERSION,
|
|
11368
11555
|
'default': WebSocketClient
|
|
11369
11556
|
});
|
|
@@ -11468,6 +11655,7 @@ class Participant extends Emitter {
|
|
|
11468
11655
|
|
|
11469
11656
|
|
|
11470
11657
|
|
|
11658
|
+
|
|
11471
11659
|
|
|
11472
11660
|
|
|
11473
11661
|
|
|
@@ -11485,6 +11673,7 @@ class Participant extends Emitter {
|
|
|
11485
11673
|
|
|
11486
11674
|
|
|
11487
11675
|
|
|
11676
|
+
|
|
11488
11677
|
|
|
11489
11678
|
/**
|
|
11490
11679
|
* @param room Room The room where the participant is
|
|
@@ -11508,6 +11697,7 @@ class Participant extends Emitter {
|
|
|
11508
11697
|
this.screensharing = false;
|
|
11509
11698
|
this.isOnHold = false;
|
|
11510
11699
|
this.extra = extra;
|
|
11700
|
+
this.banned = false;
|
|
11511
11701
|
|
|
11512
11702
|
this.ON_UPDATED = 'participant/ON_UPDATED';
|
|
11513
11703
|
this.ON_START_TALKING = 'participant/ON_START_TALKING';
|
|
@@ -11524,6 +11714,7 @@ class Participant extends Emitter {
|
|
|
11524
11714
|
this.ON_EXTRA_CHANGE = 'participant/ON_EXTRA_CHANGE';
|
|
11525
11715
|
this.ON_HOLD = 'participant/ON_HOLD';
|
|
11526
11716
|
this.ON_RESUME = 'participant/ON_RESUME';
|
|
11717
|
+
this.ON_BAN = 'participant/ON_BAN';
|
|
11527
11718
|
}
|
|
11528
11719
|
|
|
11529
11720
|
triggerEvent(name , ...args ) {
|
|
@@ -11564,6 +11755,10 @@ class Participant extends Emitter {
|
|
|
11564
11755
|
status.extra = this.extra;
|
|
11565
11756
|
break;
|
|
11566
11757
|
}
|
|
11758
|
+
case this.ON_BAN: {
|
|
11759
|
+
status.banned = true;
|
|
11760
|
+
break;
|
|
11761
|
+
}
|
|
11567
11762
|
}
|
|
11568
11763
|
|
|
11569
11764
|
if (broadcast) {
|
|
@@ -11666,6 +11861,11 @@ class Participant extends Emitter {
|
|
|
11666
11861
|
this.triggerUpdate(this.ON_RESUME, broadcast);
|
|
11667
11862
|
}
|
|
11668
11863
|
|
|
11864
|
+
onBan(broadcast = true) {
|
|
11865
|
+
this.banned = true;
|
|
11866
|
+
this.triggerUpdate(this.ON_BAN, broadcast);
|
|
11867
|
+
}
|
|
11868
|
+
|
|
11669
11869
|
getStatus() {
|
|
11670
11870
|
return {
|
|
11671
11871
|
callId: this.callId,
|
|
@@ -11712,6 +11912,10 @@ class Participant extends Emitter {
|
|
|
11712
11912
|
}
|
|
11713
11913
|
}
|
|
11714
11914
|
|
|
11915
|
+
if (status.banned) {
|
|
11916
|
+
this.onBan(false);
|
|
11917
|
+
}
|
|
11918
|
+
|
|
11715
11919
|
// Poor man's object comparison
|
|
11716
11920
|
if (typeof status.extra !== 'undefined' && JSON.stringify(this.extra) !== JSON.stringify(status.extra)) {
|
|
11717
11921
|
this.extra = { ...this.extra, ...status.extra };
|
|
@@ -11739,6 +11943,28 @@ class Participant extends Emitter {
|
|
|
11739
11943
|
this.streams = streams;
|
|
11740
11944
|
this.videoStreams = streams;
|
|
11741
11945
|
}
|
|
11946
|
+
|
|
11947
|
+
async ban(apiRequestDelay = null) {
|
|
11948
|
+
const { meetingUuid } = this.room;
|
|
11949
|
+
if (!meetingUuid) {
|
|
11950
|
+
throw new Error('Attempting to ban a participant without a `meetingUuid`');
|
|
11951
|
+
}
|
|
11952
|
+
|
|
11953
|
+
// this notifies all that someone is being banned
|
|
11954
|
+
this.onBan(true);
|
|
11955
|
+
|
|
11956
|
+
// this allows to delay the actual ban, in order for the banned participant as well as others to react to the situation
|
|
11957
|
+
if (apiRequestDelay) {
|
|
11958
|
+
await this.delay(apiRequestDelay);
|
|
11959
|
+
}
|
|
11960
|
+
|
|
11961
|
+
// proceed with the actual kick
|
|
11962
|
+
return getApiClient().calld.banMeetingParticipant(meetingUuid, this.callId);
|
|
11963
|
+
}
|
|
11964
|
+
|
|
11965
|
+
async delay(ms ) {
|
|
11966
|
+
return new Promise(resolve => setTimeout(resolve, ms));
|
|
11967
|
+
}
|
|
11742
11968
|
}
|
|
11743
11969
|
|
|
11744
11970
|
//
|
|
@@ -11891,7 +12117,7 @@ class Room$1 extends Emitter {
|
|
|
11891
12117
|
logger$3.info('connecting to room', { extension, audioOnly, room: !!room });
|
|
11892
12118
|
|
|
11893
12119
|
if (!room) {
|
|
11894
|
-
await Wazo.Phone.connect();
|
|
12120
|
+
await Wazo.Phone.connect({ media: constraints });
|
|
11895
12121
|
|
|
11896
12122
|
const withCamera = constraints && !!constraints.video;
|
|
11897
12123
|
|
|
@@ -12336,7 +12562,7 @@ class Room$1 extends Emitter {
|
|
|
12336
12562
|
const participant = this._getParticipantFromCallId(status.callId);
|
|
12337
12563
|
|
|
12338
12564
|
if (participant) {
|
|
12339
|
-
// we're
|
|
12565
|
+
// we're receiving, so no need to broadcast
|
|
12340
12566
|
participant.updateStatus(status, false);
|
|
12341
12567
|
}
|
|
12342
12568
|
break;
|
|
@@ -12603,7 +12829,7 @@ class SipRoom extends Room$1 {
|
|
|
12603
12829
|
logger$2.info('connecting to sip room', { extension, audioOnly, room: !!room });
|
|
12604
12830
|
|
|
12605
12831
|
if (!room) {
|
|
12606
|
-
await Wazo.Phone.connect();
|
|
12832
|
+
await Wazo.Phone.connect({ media: constraints });
|
|
12607
12833
|
|
|
12608
12834
|
const withCamera = constraints && !!constraints.video;
|
|
12609
12835
|
|