@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/room/Room.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 ) =>
|
|
@@ -6198,6 +6344,24 @@ const fixSdp = (sdp , candidates , forcePort = true)
|
|
|
6198
6344
|
return fixed;
|
|
6199
6345
|
};
|
|
6200
6346
|
|
|
6347
|
+
const addIcesInAllBundles = (sdp ) => {
|
|
6348
|
+
const parsedSdp = sdpParser.parse(sdp);
|
|
6349
|
+
|
|
6350
|
+
const mediaWithCandidate = parsedSdp.media.find(media => !!media.candidates);
|
|
6351
|
+
if (!mediaWithCandidate) {
|
|
6352
|
+
return sdp;
|
|
6353
|
+
}
|
|
6354
|
+
|
|
6355
|
+
const { candidates } = mediaWithCandidate;
|
|
6356
|
+
|
|
6357
|
+
parsedSdp.media = parsedSdp.media.map(media => ({
|
|
6358
|
+
...media,
|
|
6359
|
+
candidates: media.candidates || candidates,
|
|
6360
|
+
}));
|
|
6361
|
+
|
|
6362
|
+
return sdpParser.write(parsedSdp);
|
|
6363
|
+
};
|
|
6364
|
+
|
|
6201
6365
|
/* global RTCSessionDescriptionInit, navigator */
|
|
6202
6366
|
|
|
6203
6367
|
const wazoLogger = IssueReporter$1 ? IssueReporter$1.loggerFor('webrtc-sdh') : console;
|
|
@@ -6327,7 +6491,10 @@ class WazoSessionDescriptionHandler extends SessionDescriptionHandler {
|
|
|
6327
6491
|
|
|
6328
6492
|
// Check if we got ICEs
|
|
6329
6493
|
if (sdp.indexOf('a=candidate') !== -1) {
|
|
6330
|
-
return
|
|
6494
|
+
return {
|
|
6495
|
+
type: description.type,
|
|
6496
|
+
sdp: addIcesInAllBundles(sdp),
|
|
6497
|
+
};
|
|
6331
6498
|
}
|
|
6332
6499
|
|
|
6333
6500
|
wazoLogger.info('No ICE candidates found in SDP, fixing it with gathered ices', this.gatheredCandidates);
|
|
@@ -7787,41 +7954,58 @@ class WebRTCClient extends Emitter {
|
|
|
7787
7954
|
});
|
|
7788
7955
|
}
|
|
7789
7956
|
|
|
7790
|
-
changeAudioInputDevice(id , session ) {
|
|
7957
|
+
async changeAudioInputDevice(id , session , force ) {
|
|
7791
7958
|
const currentId = this.getAudioDeviceId();
|
|
7792
7959
|
logger$8.info('setting audio input device', { id, currentId, session: !!session });
|
|
7793
7960
|
|
|
7794
|
-
if (id === currentId) {
|
|
7961
|
+
if (!force && id === currentId) {
|
|
7795
7962
|
return null;
|
|
7796
7963
|
}
|
|
7797
7964
|
|
|
7965
|
+
// in order to handle an audio track change for default devices
|
|
7966
|
+
// we need the actual id of the device (not 'default')
|
|
7967
|
+
let deviceId = id;
|
|
7968
|
+
if (id === 'default' && navigator.mediaDevices) {
|
|
7969
|
+
const devices = await navigator.mediaDevices.enumerateDevices();
|
|
7970
|
+
const defaultDevice = devices.find(device => device.deviceId === 'default');
|
|
7971
|
+
if (defaultDevice) {
|
|
7972
|
+
const deviceLabel = defaultDevice.label.replace('Default - ', '');
|
|
7973
|
+
const targetDevice = devices.find(device => device.label === deviceLabel);
|
|
7974
|
+
if (targetDevice) {
|
|
7975
|
+
deviceId = targetDevice.deviceId;
|
|
7976
|
+
if (!force && deviceId === currentId) {
|
|
7977
|
+
return null;
|
|
7978
|
+
}
|
|
7979
|
+
}
|
|
7980
|
+
}
|
|
7981
|
+
}
|
|
7982
|
+
|
|
7798
7983
|
// let's update the local audio value
|
|
7799
7984
|
if (this.audio) {
|
|
7800
7985
|
this.audio = {
|
|
7801
7986
|
deviceId: {
|
|
7802
|
-
exact:
|
|
7987
|
+
exact: deviceId,
|
|
7803
7988
|
},
|
|
7804
7989
|
};
|
|
7805
7990
|
}
|
|
7806
7991
|
|
|
7807
|
-
if (session) {
|
|
7992
|
+
if (session && navigator.mediaDevices) {
|
|
7808
7993
|
const sdh = session.sessionDescriptionHandler;
|
|
7809
7994
|
const pc = sdh.peerConnection;
|
|
7810
7995
|
|
|
7811
|
-
|
|
7812
|
-
|
|
7813
|
-
|
|
7814
|
-
|
|
7996
|
+
const constraints = { audio: { deviceId: { exact: deviceId } } };
|
|
7997
|
+
const stream = await navigator.mediaDevices.getUserMedia(constraints);
|
|
7998
|
+
const audioTrack = stream.getAudioTracks()[0];
|
|
7999
|
+
const sender = pc && pc.getSenders().find(s => audioTrack && s && s.track && s.track.kind === audioTrack.kind);
|
|
7815
8000
|
|
|
7816
|
-
|
|
7817
|
-
|
|
7818
|
-
|
|
7819
|
-
}
|
|
7820
|
-
sender.replaceTrack(audioTrack);
|
|
8001
|
+
if (sender) {
|
|
8002
|
+
if (sender.track) {
|
|
8003
|
+
audioTrack.enabled = sender.track.enabled;
|
|
7821
8004
|
}
|
|
8005
|
+
sender.replaceTrack(audioTrack);
|
|
8006
|
+
}
|
|
7822
8007
|
|
|
7823
|
-
|
|
7824
|
-
});
|
|
8008
|
+
return stream;
|
|
7825
8009
|
}
|
|
7826
8010
|
}
|
|
7827
8011
|
|
|
@@ -7841,14 +8025,14 @@ class WebRTCClient extends Emitter {
|
|
|
7841
8025
|
return null;
|
|
7842
8026
|
}
|
|
7843
8027
|
|
|
7844
|
-
// let's
|
|
7845
|
-
|
|
7846
|
-
|
|
7847
|
-
|
|
7848
|
-
|
|
7849
|
-
|
|
7850
|
-
}
|
|
7851
|
-
}
|
|
8028
|
+
// let's make sure we don't lose other video constraints settings -- width, height, frameRate...
|
|
8029
|
+
const videoObject = typeof this.video === 'object' ? this.video : {};
|
|
8030
|
+
this.video = {
|
|
8031
|
+
...videoObject,
|
|
8032
|
+
deviceId: {
|
|
8033
|
+
exact: id,
|
|
8034
|
+
},
|
|
8035
|
+
};
|
|
7852
8036
|
}
|
|
7853
8037
|
|
|
7854
8038
|
changeSessionVideoInputDevice(id , session ) {
|
|
@@ -9587,10 +9771,10 @@ class WebRTCPhone extends Emitter {
|
|
|
9587
9771
|
this.audioRingVolume = volume;
|
|
9588
9772
|
}
|
|
9589
9773
|
|
|
9590
|
-
changeAudioInputDevice(id ) {
|
|
9774
|
+
changeAudioInputDevice(id , force ) {
|
|
9591
9775
|
logger$7.info('WebRTC phone - changeAudio input device', { deviceId: id });
|
|
9592
9776
|
|
|
9593
|
-
return this.client.changeAudioInputDevice(id, this.currentSipSession);
|
|
9777
|
+
return this.client.changeAudioInputDevice(id, this.currentSipSession, force);
|
|
9594
9778
|
}
|
|
9595
9779
|
|
|
9596
9780
|
changeVideoInputDevice(id ) {
|
|
@@ -11243,6 +11427,7 @@ const AGENT_UNPAUSED = 'agent_unpaused';
|
|
|
11243
11427
|
const CONFERENCE_ADHOC_PARTICIPANT_LEFT = 'conference_adhoc_participant_left';
|
|
11244
11428
|
const CONFERENCE_ADHOC_DELETED = 'conference_adhoc_deleted';
|
|
11245
11429
|
const MEETING_USER_PROGRESS = 'meeting_user_progress';
|
|
11430
|
+
const MEETING_USER_GUEST_AUTHORIZATION_CREATED = 'meeting_user_guest_authorization_created';
|
|
11246
11431
|
|
|
11247
11432
|
const BLACKLIST_EVENTS = [
|
|
11248
11433
|
CHAT_MESSAGE_SENT,
|
|
@@ -11594,6 +11779,7 @@ WebSocketClient.eventLists = [
|
|
|
11594
11779
|
CONFERENCE_ADHOC_PARTICIPANT_LEFT,
|
|
11595
11780
|
CONFERENCE_ADHOC_DELETED,
|
|
11596
11781
|
MEETING_USER_PROGRESS,
|
|
11782
|
+
MEETING_USER_GUEST_AUTHORIZATION_CREATED,
|
|
11597
11783
|
];
|
|
11598
11784
|
|
|
11599
11785
|
var WebSocketClient$1 = /*#__PURE__*/Object.freeze({
|
|
@@ -11665,6 +11851,7 @@ var WebSocketClient$1 = /*#__PURE__*/Object.freeze({
|
|
|
11665
11851
|
CONFERENCE_ADHOC_PARTICIPANT_LEFT: CONFERENCE_ADHOC_PARTICIPANT_LEFT,
|
|
11666
11852
|
CONFERENCE_ADHOC_DELETED: CONFERENCE_ADHOC_DELETED,
|
|
11667
11853
|
MEETING_USER_PROGRESS: MEETING_USER_PROGRESS,
|
|
11854
|
+
MEETING_USER_GUEST_AUTHORIZATION_CREATED: MEETING_USER_GUEST_AUTHORIZATION_CREATED,
|
|
11668
11855
|
HEARTBEAT_ENGINE_VERSION: HEARTBEAT_ENGINE_VERSION,
|
|
11669
11856
|
'default': WebSocketClient
|
|
11670
11857
|
});
|
|
@@ -11762,7 +11949,7 @@ class SipRoom extends Room {
|
|
|
11762
11949
|
logger$3.info('connecting to sip room', { extension, audioOnly, room: !!room });
|
|
11763
11950
|
|
|
11764
11951
|
if (!room) {
|
|
11765
|
-
await Wazo.Phone.connect();
|
|
11952
|
+
await Wazo.Phone.connect({ media: constraints });
|
|
11766
11953
|
|
|
11767
11954
|
const withCamera = constraints && !!constraints.video;
|
|
11768
11955
|
|
|
@@ -11908,6 +12095,7 @@ class Participant extends Emitter {
|
|
|
11908
12095
|
|
|
11909
12096
|
|
|
11910
12097
|
|
|
12098
|
+
|
|
11911
12099
|
|
|
11912
12100
|
|
|
11913
12101
|
|
|
@@ -11925,6 +12113,7 @@ class Participant extends Emitter {
|
|
|
11925
12113
|
|
|
11926
12114
|
|
|
11927
12115
|
|
|
12116
|
+
|
|
11928
12117
|
|
|
11929
12118
|
/**
|
|
11930
12119
|
* @param room Room The room where the participant is
|
|
@@ -11948,6 +12137,7 @@ class Participant extends Emitter {
|
|
|
11948
12137
|
this.screensharing = false;
|
|
11949
12138
|
this.isOnHold = false;
|
|
11950
12139
|
this.extra = extra;
|
|
12140
|
+
this.banned = false;
|
|
11951
12141
|
|
|
11952
12142
|
this.ON_UPDATED = 'participant/ON_UPDATED';
|
|
11953
12143
|
this.ON_START_TALKING = 'participant/ON_START_TALKING';
|
|
@@ -11964,6 +12154,7 @@ class Participant extends Emitter {
|
|
|
11964
12154
|
this.ON_EXTRA_CHANGE = 'participant/ON_EXTRA_CHANGE';
|
|
11965
12155
|
this.ON_HOLD = 'participant/ON_HOLD';
|
|
11966
12156
|
this.ON_RESUME = 'participant/ON_RESUME';
|
|
12157
|
+
this.ON_BAN = 'participant/ON_BAN';
|
|
11967
12158
|
}
|
|
11968
12159
|
|
|
11969
12160
|
triggerEvent(name , ...args ) {
|
|
@@ -12004,6 +12195,10 @@ class Participant extends Emitter {
|
|
|
12004
12195
|
status.extra = this.extra;
|
|
12005
12196
|
break;
|
|
12006
12197
|
}
|
|
12198
|
+
case this.ON_BAN: {
|
|
12199
|
+
status.banned = true;
|
|
12200
|
+
break;
|
|
12201
|
+
}
|
|
12007
12202
|
}
|
|
12008
12203
|
|
|
12009
12204
|
if (broadcast) {
|
|
@@ -12106,6 +12301,11 @@ class Participant extends Emitter {
|
|
|
12106
12301
|
this.triggerUpdate(this.ON_RESUME, broadcast);
|
|
12107
12302
|
}
|
|
12108
12303
|
|
|
12304
|
+
onBan(broadcast = true) {
|
|
12305
|
+
this.banned = true;
|
|
12306
|
+
this.triggerUpdate(this.ON_BAN, broadcast);
|
|
12307
|
+
}
|
|
12308
|
+
|
|
12109
12309
|
getStatus() {
|
|
12110
12310
|
return {
|
|
12111
12311
|
callId: this.callId,
|
|
@@ -12152,6 +12352,10 @@ class Participant extends Emitter {
|
|
|
12152
12352
|
}
|
|
12153
12353
|
}
|
|
12154
12354
|
|
|
12355
|
+
if (status.banned) {
|
|
12356
|
+
this.onBan(false);
|
|
12357
|
+
}
|
|
12358
|
+
|
|
12155
12359
|
// Poor man's object comparison
|
|
12156
12360
|
if (typeof status.extra !== 'undefined' && JSON.stringify(this.extra) !== JSON.stringify(status.extra)) {
|
|
12157
12361
|
this.extra = { ...this.extra, ...status.extra };
|
|
@@ -12179,6 +12383,28 @@ class Participant extends Emitter {
|
|
|
12179
12383
|
this.streams = streams;
|
|
12180
12384
|
this.videoStreams = streams;
|
|
12181
12385
|
}
|
|
12386
|
+
|
|
12387
|
+
async ban(apiRequestDelay = null) {
|
|
12388
|
+
const { meetingUuid } = this.room;
|
|
12389
|
+
if (!meetingUuid) {
|
|
12390
|
+
throw new Error('Attempting to ban a participant without a `meetingUuid`');
|
|
12391
|
+
}
|
|
12392
|
+
|
|
12393
|
+
// this notifies all that someone is being banned
|
|
12394
|
+
this.onBan(true);
|
|
12395
|
+
|
|
12396
|
+
// this allows to delay the actual ban, in order for the banned participant as well as others to react to the situation
|
|
12397
|
+
if (apiRequestDelay) {
|
|
12398
|
+
await this.delay(apiRequestDelay);
|
|
12399
|
+
}
|
|
12400
|
+
|
|
12401
|
+
// proceed with the actual kick
|
|
12402
|
+
return getApiClient().calld.banMeetingParticipant(meetingUuid, this.callId);
|
|
12403
|
+
}
|
|
12404
|
+
|
|
12405
|
+
async delay(ms ) {
|
|
12406
|
+
return new Promise(resolve => setTimeout(resolve, ms));
|
|
12407
|
+
}
|
|
12182
12408
|
}
|
|
12183
12409
|
|
|
12184
12410
|
//
|
|
@@ -13739,7 +13965,7 @@ class Room extends Emitter {
|
|
|
13739
13965
|
logger.info('connecting to room', { extension, audioOnly, room: !!room });
|
|
13740
13966
|
|
|
13741
13967
|
if (!room) {
|
|
13742
|
-
await Wazo.Phone.connect();
|
|
13968
|
+
await Wazo.Phone.connect({ media: constraints });
|
|
13743
13969
|
|
|
13744
13970
|
const withCamera = constraints && !!constraints.video;
|
|
13745
13971
|
|
|
@@ -14184,7 +14410,7 @@ class Room extends Emitter {
|
|
|
14184
14410
|
const participant = this._getParticipantFromCallId(status.callId);
|
|
14185
14411
|
|
|
14186
14412
|
if (participant) {
|
|
14187
|
-
// we're
|
|
14413
|
+
// we're receiving, so no need to broadcast
|
|
14188
14414
|
participant.updateStatus(status, false);
|
|
14189
14415
|
}
|
|
14190
14416
|
break;
|