@wazo/sdk 0.38.6 → 0.38.9
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/dist/wazo-sdk.js +2 -2
- package/esm/__tests__/api-client.test.js +142 -2
- package/esm/__tests__/web-rtc-client.test.js +249 -28
- package/esm/api/calld.js +8 -0
- package/esm/api/confd.js +134 -2
- package/esm/api-client.js +142 -2
- package/esm/checker/Checker.js +205 -25
- package/esm/checker/checks/aor.js +142 -2
- package/esm/checker/checks/api.js +142 -2
- package/esm/checker/checks/index.js +205 -25
- package/esm/checker/checks/wazo-websocket.js +2 -0
- package/esm/checker/checks/webrtc-transport.js +203 -25
- package/esm/checker/checks/webrtc.js +203 -25
- package/esm/domain/AdHocAPIConference.js +142 -2
- package/esm/domain/Features.js +142 -2
- package/esm/domain/Meeting.js +18 -0
- package/esm/domain/MeetingAuthorization.js +70 -0
- package/esm/domain/Phone/CTIPhone.js +142 -2
- package/esm/domain/Phone/WebRTCPhone.js +1 -3
- package/esm/domain/__tests__/Meeting.test.js +87 -1
- package/esm/domain/__tests__/MeetingAuthorization.test.js +109 -0
- package/esm/index.js +249 -31
- package/esm/lib/WazoSessionDescriptionHandler.js +22 -1
- package/esm/service/CallApi.js +142 -2
- package/esm/service/getApiClient.js +142 -2
- package/esm/simple/Auth.js +249 -31
- package/esm/simple/Configuration.js +249 -31
- package/esm/simple/Directory.js +142 -2
- package/esm/simple/Phone.js +249 -31
- package/esm/simple/Websocket.js +3 -0
- package/esm/simple/index.js +249 -31
- package/esm/simple/room/LocalParticipant.js +249 -31
- package/esm/simple/room/Participant.js +249 -31
- package/esm/simple/room/RemoteParticipant.js +249 -31
- package/esm/simple/room/Room.js +249 -31
- package/esm/simple/room/SipRoom.js +249 -31
- package/esm/simple/room/Stream.js +249 -31
- package/esm/simple/room/__tests__/Participant.test.js +14745 -0
- package/esm/simple/room/__tests__/RemoteParticipant.test.js +249 -31
- package/esm/simple/utils.js +249 -31
- 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 +203 -25
- package/esm/websocket-client.js +3 -1
- package/lib/__tests__/api-client.test.js +142 -2
- package/lib/__tests__/web-rtc-client.test.js +249 -28
- package/lib/api/calld.js +8 -0
- package/lib/api/confd.js +134 -2
- package/lib/api-client.js +142 -2
- package/lib/checker/Checker.js +205 -25
- package/lib/checker/checks/aor.js +142 -2
- package/lib/checker/checks/api.js +142 -2
- package/lib/checker/checks/index.js +205 -25
- package/lib/checker/checks/wazo-websocket.js +2 -0
- package/lib/checker/checks/webrtc-transport.js +203 -25
- package/lib/checker/checks/webrtc.js +203 -25
- package/lib/domain/AdHocAPIConference.js +142 -2
- package/lib/domain/Features.js +142 -2
- package/lib/domain/Meeting.js +18 -0
- package/lib/domain/MeetingAuthorization.js +79 -0
- package/lib/domain/Phone/CTIPhone.js +142 -2
- package/lib/domain/Phone/WebRTCPhone.js +1 -3
- package/lib/domain/__tests__/Meeting.test.js +87 -1
- package/lib/domain/__tests__/MeetingAuthorization.test.js +111 -0
- package/lib/index.js +249 -31
- package/lib/lib/WazoSessionDescriptionHandler.js +22 -1
- package/lib/service/CallApi.js +142 -2
- package/lib/service/getApiClient.js +142 -2
- package/lib/simple/Auth.js +249 -31
- package/lib/simple/Configuration.js +249 -31
- package/lib/simple/Directory.js +142 -2
- package/lib/simple/Phone.js +249 -31
- package/lib/simple/Websocket.js +3 -0
- package/lib/simple/index.js +249 -31
- package/lib/simple/room/LocalParticipant.js +249 -31
- package/lib/simple/room/Participant.js +249 -31
- package/lib/simple/room/RemoteParticipant.js +249 -31
- package/lib/simple/room/Room.js +249 -31
- package/lib/simple/room/SipRoom.js +249 -31
- package/lib/simple/room/Stream.js +249 -31
- package/lib/simple/room/__tests__/Participant.test.js +14755 -0
- package/lib/simple/room/__tests__/RemoteParticipant.test.js +249 -31
- package/lib/simple/utils.js +249 -31
- 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 +203 -25
- package/lib/websocket-client.js +3 -0
- package/package.json +2 -2
- package/src/__tests__/web-rtc-client.test.js +46 -3
- package/src/api/calld.js +8 -0
- package/src/api/confd.js +43 -2
- package/src/domain/Meeting.js +20 -0
- package/src/domain/MeetingAuthorization.js +67 -0
- package/src/domain/Phone/WebRTCPhone.js +1 -3
- 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 +39 -22
- package/src/websocket-client.js +2 -0
|
@@ -2625,6 +2625,70 @@ class ExternalApp {
|
|
|
2625
2625
|
|
|
2626
2626
|
//
|
|
2627
2627
|
|
|
2628
|
+
class MeetingAuthorization {
|
|
2629
|
+
|
|
2630
|
+
|
|
2631
|
+
|
|
2632
|
+
|
|
2633
|
+
|
|
2634
|
+
|
|
2635
|
+
constructor({
|
|
2636
|
+
meetingUuid,
|
|
2637
|
+
uuid,
|
|
2638
|
+
userUuid,
|
|
2639
|
+
userName,
|
|
2640
|
+
} = {}) {
|
|
2641
|
+
this.meetingUuid = meetingUuid;
|
|
2642
|
+
this.uuid = uuid;
|
|
2643
|
+
this.userUuid = userUuid;
|
|
2644
|
+
this.userName = userName;
|
|
2645
|
+
}
|
|
2646
|
+
|
|
2647
|
+
setStatus(status ) {
|
|
2648
|
+
this.status = status;
|
|
2649
|
+
}
|
|
2650
|
+
|
|
2651
|
+
getStatus() {
|
|
2652
|
+
return this.status;
|
|
2653
|
+
}
|
|
2654
|
+
|
|
2655
|
+
static parse(plain ) {
|
|
2656
|
+
const {
|
|
2657
|
+
meeting_uuid: meetingUuid,
|
|
2658
|
+
uuid,
|
|
2659
|
+
guest_uuid: userUuid,
|
|
2660
|
+
guest_name: userName,
|
|
2661
|
+
} = plain;
|
|
2662
|
+
|
|
2663
|
+
return new MeetingAuthorization({
|
|
2664
|
+
meetingUuid,
|
|
2665
|
+
uuid,
|
|
2666
|
+
userUuid,
|
|
2667
|
+
userName,
|
|
2668
|
+
});
|
|
2669
|
+
}
|
|
2670
|
+
|
|
2671
|
+
static parseMany(items ) {
|
|
2672
|
+
if (!items) {
|
|
2673
|
+
return [];
|
|
2674
|
+
}
|
|
2675
|
+
return items.map(MeetingAuthorization.parse);
|
|
2676
|
+
}
|
|
2677
|
+
}
|
|
2678
|
+
|
|
2679
|
+
//
|
|
2680
|
+
|
|
2681
|
+
|
|
2682
|
+
|
|
2683
|
+
|
|
2684
|
+
|
|
2685
|
+
|
|
2686
|
+
|
|
2687
|
+
|
|
2688
|
+
|
|
2689
|
+
|
|
2690
|
+
|
|
2691
|
+
|
|
2628
2692
|
|
|
2629
2693
|
|
|
2630
2694
|
|
|
@@ -2635,6 +2699,7 @@ class ExternalApp {
|
|
|
2635
2699
|
|
|
2636
2700
|
|
|
2637
2701
|
|
|
2702
|
+
|
|
2638
2703
|
|
|
2639
2704
|
|
|
2640
2705
|
class Meeting {
|
|
@@ -2649,6 +2714,8 @@ class Meeting {
|
|
|
2649
2714
|
|
|
2650
2715
|
|
|
2651
2716
|
|
|
2717
|
+
|
|
2718
|
+
|
|
2652
2719
|
|
|
2653
2720
|
static parse(plain ) {
|
|
2654
2721
|
return new Meeting({
|
|
@@ -2661,6 +2728,7 @@ class Meeting {
|
|
|
2661
2728
|
extension: plain.exten,
|
|
2662
2729
|
persistent: plain.persistent,
|
|
2663
2730
|
creationTime: moment(plain.creation_time).toDate(),
|
|
2731
|
+
requireAuthorization: plain.require_authorization,
|
|
2664
2732
|
});
|
|
2665
2733
|
}
|
|
2666
2734
|
|
|
@@ -2685,6 +2753,7 @@ class Meeting {
|
|
|
2685
2753
|
extension,
|
|
2686
2754
|
persistent,
|
|
2687
2755
|
creationTime,
|
|
2756
|
+
requireAuthorization,
|
|
2688
2757
|
} = {}) {
|
|
2689
2758
|
this.guestSipAuthorization = guestSipAuthorization;
|
|
2690
2759
|
this.uri = uri;
|
|
@@ -2695,6 +2764,7 @@ class Meeting {
|
|
|
2695
2764
|
this.extension = extension;
|
|
2696
2765
|
this.persistent = persistent;
|
|
2697
2766
|
this.creationTime = creationTime;
|
|
2767
|
+
this.requireAuthorization = requireAuthorization;
|
|
2698
2768
|
|
|
2699
2769
|
// Useful to compare instead of instanceof with minified code
|
|
2700
2770
|
this.type = 'Meeting';
|
|
@@ -2705,8 +2775,32 @@ class Meeting {
|
|
|
2705
2775
|
const [username, secret] = atob(this.guestSipAuthorization).split(':');
|
|
2706
2776
|
return { username, secret };
|
|
2707
2777
|
}
|
|
2778
|
+
|
|
2708
2779
|
}
|
|
2709
2780
|
|
|
2781
|
+
//
|
|
2782
|
+
|
|
2783
|
+
const camelToUnderscore = (key ) => {
|
|
2784
|
+
if (typeof key !== 'string') {
|
|
2785
|
+
throw new Error('Input is not a string');
|
|
2786
|
+
}
|
|
2787
|
+
return key.charAt(0).toLowerCase() + key.substring(1).replace(/([A-Z])/g, '_$1').toLowerCase();
|
|
2788
|
+
};
|
|
2789
|
+
|
|
2790
|
+
//
|
|
2791
|
+
|
|
2792
|
+
const convertKeysFromCamelToUnderscore = (args ) => {
|
|
2793
|
+
if (!args || typeof args !== 'object' || Array.isArray(args)) {
|
|
2794
|
+
throw new Error('Input is not an object');
|
|
2795
|
+
}
|
|
2796
|
+
|
|
2797
|
+
return Object.keys(args).reduce((acc, key) => {
|
|
2798
|
+
acc[camelToUnderscore(key)] = typeof args[key] === 'object' && !Array.isArray(args[key])
|
|
2799
|
+
? convertKeysFromCamelToUnderscore(args[key]) : args[key];
|
|
2800
|
+
return acc;
|
|
2801
|
+
}, {});
|
|
2802
|
+
};
|
|
2803
|
+
|
|
2710
2804
|
/* */
|
|
2711
2805
|
|
|
2712
2806
|
var confdMethods = (client , baseUrl ) => ({
|
|
@@ -2775,8 +2869,18 @@ var confdMethods = (client , baseUrl ) => ({
|
|
|
2775
2869
|
getMyMeetings: () =>
|
|
2776
2870
|
client.get(`${baseUrl}/users/me/meetings`).then(response => Meeting.parseMany(response.items)),
|
|
2777
2871
|
|
|
2778
|
-
createMyMeeting: (
|
|
2779
|
-
client
|
|
2872
|
+
createMyMeeting: (args ) =>
|
|
2873
|
+
client
|
|
2874
|
+
.post(`${baseUrl}/users/me/meetings`, convertKeysFromCamelToUnderscore(args))
|
|
2875
|
+
.then(Meeting.parse),
|
|
2876
|
+
|
|
2877
|
+
updateMyMeeting: (meetingUuid , data ) =>
|
|
2878
|
+
client.put(
|
|
2879
|
+
`${baseUrl}/users/me/meetings/${meetingUuid}`,
|
|
2880
|
+
convertKeysFromCamelToUnderscore(data),
|
|
2881
|
+
null,
|
|
2882
|
+
ApiRequester.successResponseParser,
|
|
2883
|
+
),
|
|
2780
2884
|
|
|
2781
2885
|
deleteMyMeeting: (meetingUuid ) =>
|
|
2782
2886
|
client.delete(`${baseUrl}/users/me/meetings/${meetingUuid}`, null),
|
|
@@ -2784,8 +2888,36 @@ var confdMethods = (client , baseUrl ) => ({
|
|
|
2784
2888
|
getMeeting: (meetingUuid ) =>
|
|
2785
2889
|
client.get(`${baseUrl}/meetings/${meetingUuid}`, null).then(Meeting.parse),
|
|
2786
2890
|
|
|
2891
|
+
meetingAuthorizations: (meetingUuid ) =>
|
|
2892
|
+
client.get(`${baseUrl}/users/me/meetings/${meetingUuid}/authorizations`, null).then(MeetingAuthorization.parseMany),
|
|
2893
|
+
|
|
2894
|
+
meetingAuthorizationReject: (meetingUuid , authorizationUuid ) =>
|
|
2895
|
+
client.put(
|
|
2896
|
+
`${baseUrl}/users/me/meetings/${meetingUuid}/authorizations/${authorizationUuid}/reject`,
|
|
2897
|
+
{},
|
|
2898
|
+
null,
|
|
2899
|
+
ApiRequester.successResponseParser,
|
|
2900
|
+
),
|
|
2901
|
+
|
|
2902
|
+
meetingAuthorizationAccept: (meetingUuid , authorizationUuid ) =>
|
|
2903
|
+
client.put(
|
|
2904
|
+
`${baseUrl}/users/me/meetings/${meetingUuid}/authorizations/${authorizationUuid}/accept`,
|
|
2905
|
+
{},
|
|
2906
|
+
null,
|
|
2907
|
+
ApiRequester.successResponseParser,
|
|
2908
|
+
),
|
|
2909
|
+
|
|
2787
2910
|
guestGetMeeting: (meetingUuid ) =>
|
|
2788
2911
|
client.get(`${baseUrl}/guests/me/meetings/${meetingUuid}`, null).then(Meeting.parse),
|
|
2912
|
+
|
|
2913
|
+
guestAuthorizationRequest: (userUuid , meetingUuid , username ) =>
|
|
2914
|
+
client
|
|
2915
|
+
.post(`${baseUrl}/guests/${userUuid}/meetings/${meetingUuid}/authorizations`, { guest_name: username })
|
|
2916
|
+
.then(MeetingAuthorization.parse),
|
|
2917
|
+
|
|
2918
|
+
guestAuthorizationCheck: (userUuid , meetingUuid , authorizationUuid ) =>
|
|
2919
|
+
client.get(`${baseUrl}/guests/${userUuid}/meetings/${meetingUuid}/authorizations/${authorizationUuid}`, null),
|
|
2920
|
+
|
|
2789
2921
|
});
|
|
2790
2922
|
|
|
2791
2923
|
//
|
|
@@ -4224,6 +4356,14 @@ var calldMethods = (client , baseUrl ) => ({
|
|
|
4224
4356
|
getMeetingParticipantsAsUser: async (meetingUuid ) =>
|
|
4225
4357
|
client.get(`${baseUrl}/users/me/meetings/${meetingUuid}/participants`),
|
|
4226
4358
|
|
|
4359
|
+
banMeetingParticipant: (meetingUuid , participantUuid ) =>
|
|
4360
|
+
client.delete(
|
|
4361
|
+
`${baseUrl}/users/me/meetings/${meetingUuid}/participants/${participantUuid}`,
|
|
4362
|
+
null,
|
|
4363
|
+
null,
|
|
4364
|
+
ApiRequester.successResponseParser,
|
|
4365
|
+
),
|
|
4366
|
+
|
|
4227
4367
|
listTrunks: () => client.get(`${baseUrl}/trunks`),
|
|
4228
4368
|
|
|
4229
4369
|
mute: (callId ) =>
|
|
@@ -778,6 +778,24 @@ const fixSdp = (sdp , candidates , forcePort = true)
|
|
|
778
778
|
return fixed;
|
|
779
779
|
};
|
|
780
780
|
|
|
781
|
+
const addIcesInAllBundles = (sdp ) => {
|
|
782
|
+
const parsedSdp = sdpParser.parse(sdp);
|
|
783
|
+
|
|
784
|
+
const mediaWithCandidate = parsedSdp.media.find(media => !!media.candidates);
|
|
785
|
+
if (!mediaWithCandidate) {
|
|
786
|
+
return sdp;
|
|
787
|
+
}
|
|
788
|
+
|
|
789
|
+
const { candidates } = mediaWithCandidate;
|
|
790
|
+
|
|
791
|
+
parsedSdp.media = parsedSdp.media.map(media => ({
|
|
792
|
+
...media,
|
|
793
|
+
candidates: media.candidates || candidates,
|
|
794
|
+
}));
|
|
795
|
+
|
|
796
|
+
return sdpParser.write(parsedSdp);
|
|
797
|
+
};
|
|
798
|
+
|
|
781
799
|
/* global RTCSessionDescriptionInit, navigator */
|
|
782
800
|
|
|
783
801
|
const wazoLogger = IssueReporter$1 ? IssueReporter$1.loggerFor('webrtc-sdh') : console;
|
|
@@ -907,7 +925,10 @@ class WazoSessionDescriptionHandler extends SessionDescriptionHandler {
|
|
|
907
925
|
|
|
908
926
|
// Check if we got ICEs
|
|
909
927
|
if (sdp.indexOf('a=candidate') !== -1) {
|
|
910
|
-
return
|
|
928
|
+
return {
|
|
929
|
+
type: description.type,
|
|
930
|
+
sdp: addIcesInAllBundles(sdp),
|
|
931
|
+
};
|
|
911
932
|
}
|
|
912
933
|
|
|
913
934
|
wazoLogger.info('No ICE candidates found in SDP, fixing it with gathered ices', this.gatheredCandidates);
|
|
@@ -3181,6 +3202,70 @@ class ExternalApp {
|
|
|
3181
3202
|
|
|
3182
3203
|
//
|
|
3183
3204
|
|
|
3205
|
+
class MeetingAuthorization {
|
|
3206
|
+
|
|
3207
|
+
|
|
3208
|
+
|
|
3209
|
+
|
|
3210
|
+
|
|
3211
|
+
|
|
3212
|
+
constructor({
|
|
3213
|
+
meetingUuid,
|
|
3214
|
+
uuid,
|
|
3215
|
+
userUuid,
|
|
3216
|
+
userName,
|
|
3217
|
+
} = {}) {
|
|
3218
|
+
this.meetingUuid = meetingUuid;
|
|
3219
|
+
this.uuid = uuid;
|
|
3220
|
+
this.userUuid = userUuid;
|
|
3221
|
+
this.userName = userName;
|
|
3222
|
+
}
|
|
3223
|
+
|
|
3224
|
+
setStatus(status ) {
|
|
3225
|
+
this.status = status;
|
|
3226
|
+
}
|
|
3227
|
+
|
|
3228
|
+
getStatus() {
|
|
3229
|
+
return this.status;
|
|
3230
|
+
}
|
|
3231
|
+
|
|
3232
|
+
static parse(plain ) {
|
|
3233
|
+
const {
|
|
3234
|
+
meeting_uuid: meetingUuid,
|
|
3235
|
+
uuid,
|
|
3236
|
+
guest_uuid: userUuid,
|
|
3237
|
+
guest_name: userName,
|
|
3238
|
+
} = plain;
|
|
3239
|
+
|
|
3240
|
+
return new MeetingAuthorization({
|
|
3241
|
+
meetingUuid,
|
|
3242
|
+
uuid,
|
|
3243
|
+
userUuid,
|
|
3244
|
+
userName,
|
|
3245
|
+
});
|
|
3246
|
+
}
|
|
3247
|
+
|
|
3248
|
+
static parseMany(items ) {
|
|
3249
|
+
if (!items) {
|
|
3250
|
+
return [];
|
|
3251
|
+
}
|
|
3252
|
+
return items.map(MeetingAuthorization.parse);
|
|
3253
|
+
}
|
|
3254
|
+
}
|
|
3255
|
+
|
|
3256
|
+
//
|
|
3257
|
+
|
|
3258
|
+
|
|
3259
|
+
|
|
3260
|
+
|
|
3261
|
+
|
|
3262
|
+
|
|
3263
|
+
|
|
3264
|
+
|
|
3265
|
+
|
|
3266
|
+
|
|
3267
|
+
|
|
3268
|
+
|
|
3184
3269
|
|
|
3185
3270
|
|
|
3186
3271
|
|
|
@@ -3191,6 +3276,7 @@ class ExternalApp {
|
|
|
3191
3276
|
|
|
3192
3277
|
|
|
3193
3278
|
|
|
3279
|
+
|
|
3194
3280
|
|
|
3195
3281
|
|
|
3196
3282
|
class Meeting {
|
|
@@ -3205,6 +3291,8 @@ class Meeting {
|
|
|
3205
3291
|
|
|
3206
3292
|
|
|
3207
3293
|
|
|
3294
|
+
|
|
3295
|
+
|
|
3208
3296
|
|
|
3209
3297
|
static parse(plain ) {
|
|
3210
3298
|
return new Meeting({
|
|
@@ -3217,6 +3305,7 @@ class Meeting {
|
|
|
3217
3305
|
extension: plain.exten,
|
|
3218
3306
|
persistent: plain.persistent,
|
|
3219
3307
|
creationTime: moment(plain.creation_time).toDate(),
|
|
3308
|
+
requireAuthorization: plain.require_authorization,
|
|
3220
3309
|
});
|
|
3221
3310
|
}
|
|
3222
3311
|
|
|
@@ -3241,6 +3330,7 @@ class Meeting {
|
|
|
3241
3330
|
extension,
|
|
3242
3331
|
persistent,
|
|
3243
3332
|
creationTime,
|
|
3333
|
+
requireAuthorization,
|
|
3244
3334
|
} = {}) {
|
|
3245
3335
|
this.guestSipAuthorization = guestSipAuthorization;
|
|
3246
3336
|
this.uri = uri;
|
|
@@ -3251,6 +3341,7 @@ class Meeting {
|
|
|
3251
3341
|
this.extension = extension;
|
|
3252
3342
|
this.persistent = persistent;
|
|
3253
3343
|
this.creationTime = creationTime;
|
|
3344
|
+
this.requireAuthorization = requireAuthorization;
|
|
3254
3345
|
|
|
3255
3346
|
// Useful to compare instead of instanceof with minified code
|
|
3256
3347
|
this.type = 'Meeting';
|
|
@@ -3261,8 +3352,32 @@ class Meeting {
|
|
|
3261
3352
|
const [username, secret] = atob(this.guestSipAuthorization).split(':');
|
|
3262
3353
|
return { username, secret };
|
|
3263
3354
|
}
|
|
3355
|
+
|
|
3264
3356
|
}
|
|
3265
3357
|
|
|
3358
|
+
//
|
|
3359
|
+
|
|
3360
|
+
const camelToUnderscore = (key ) => {
|
|
3361
|
+
if (typeof key !== 'string') {
|
|
3362
|
+
throw new Error('Input is not a string');
|
|
3363
|
+
}
|
|
3364
|
+
return key.charAt(0).toLowerCase() + key.substring(1).replace(/([A-Z])/g, '_$1').toLowerCase();
|
|
3365
|
+
};
|
|
3366
|
+
|
|
3367
|
+
//
|
|
3368
|
+
|
|
3369
|
+
const convertKeysFromCamelToUnderscore = (args ) => {
|
|
3370
|
+
if (!args || typeof args !== 'object' || Array.isArray(args)) {
|
|
3371
|
+
throw new Error('Input is not an object');
|
|
3372
|
+
}
|
|
3373
|
+
|
|
3374
|
+
return Object.keys(args).reduce((acc, key) => {
|
|
3375
|
+
acc[camelToUnderscore(key)] = typeof args[key] === 'object' && !Array.isArray(args[key])
|
|
3376
|
+
? convertKeysFromCamelToUnderscore(args[key]) : args[key];
|
|
3377
|
+
return acc;
|
|
3378
|
+
}, {});
|
|
3379
|
+
};
|
|
3380
|
+
|
|
3266
3381
|
/* */
|
|
3267
3382
|
|
|
3268
3383
|
var confdMethods = (client , baseUrl ) => ({
|
|
@@ -3331,8 +3446,18 @@ var confdMethods = (client , baseUrl ) => ({
|
|
|
3331
3446
|
getMyMeetings: () =>
|
|
3332
3447
|
client.get(`${baseUrl}/users/me/meetings`).then(response => Meeting.parseMany(response.items)),
|
|
3333
3448
|
|
|
3334
|
-
createMyMeeting: (
|
|
3335
|
-
client
|
|
3449
|
+
createMyMeeting: (args ) =>
|
|
3450
|
+
client
|
|
3451
|
+
.post(`${baseUrl}/users/me/meetings`, convertKeysFromCamelToUnderscore(args))
|
|
3452
|
+
.then(Meeting.parse),
|
|
3453
|
+
|
|
3454
|
+
updateMyMeeting: (meetingUuid , data ) =>
|
|
3455
|
+
client.put(
|
|
3456
|
+
`${baseUrl}/users/me/meetings/${meetingUuid}`,
|
|
3457
|
+
convertKeysFromCamelToUnderscore(data),
|
|
3458
|
+
null,
|
|
3459
|
+
ApiRequester.successResponseParser,
|
|
3460
|
+
),
|
|
3336
3461
|
|
|
3337
3462
|
deleteMyMeeting: (meetingUuid ) =>
|
|
3338
3463
|
client.delete(`${baseUrl}/users/me/meetings/${meetingUuid}`, null),
|
|
@@ -3340,8 +3465,36 @@ var confdMethods = (client , baseUrl ) => ({
|
|
|
3340
3465
|
getMeeting: (meetingUuid ) =>
|
|
3341
3466
|
client.get(`${baseUrl}/meetings/${meetingUuid}`, null).then(Meeting.parse),
|
|
3342
3467
|
|
|
3468
|
+
meetingAuthorizations: (meetingUuid ) =>
|
|
3469
|
+
client.get(`${baseUrl}/users/me/meetings/${meetingUuid}/authorizations`, null).then(MeetingAuthorization.parseMany),
|
|
3470
|
+
|
|
3471
|
+
meetingAuthorizationReject: (meetingUuid , authorizationUuid ) =>
|
|
3472
|
+
client.put(
|
|
3473
|
+
`${baseUrl}/users/me/meetings/${meetingUuid}/authorizations/${authorizationUuid}/reject`,
|
|
3474
|
+
{},
|
|
3475
|
+
null,
|
|
3476
|
+
ApiRequester.successResponseParser,
|
|
3477
|
+
),
|
|
3478
|
+
|
|
3479
|
+
meetingAuthorizationAccept: (meetingUuid , authorizationUuid ) =>
|
|
3480
|
+
client.put(
|
|
3481
|
+
`${baseUrl}/users/me/meetings/${meetingUuid}/authorizations/${authorizationUuid}/accept`,
|
|
3482
|
+
{},
|
|
3483
|
+
null,
|
|
3484
|
+
ApiRequester.successResponseParser,
|
|
3485
|
+
),
|
|
3486
|
+
|
|
3343
3487
|
guestGetMeeting: (meetingUuid ) =>
|
|
3344
3488
|
client.get(`${baseUrl}/guests/me/meetings/${meetingUuid}`, null).then(Meeting.parse),
|
|
3489
|
+
|
|
3490
|
+
guestAuthorizationRequest: (userUuid , meetingUuid , username ) =>
|
|
3491
|
+
client
|
|
3492
|
+
.post(`${baseUrl}/guests/${userUuid}/meetings/${meetingUuid}/authorizations`, { guest_name: username })
|
|
3493
|
+
.then(MeetingAuthorization.parse),
|
|
3494
|
+
|
|
3495
|
+
guestAuthorizationCheck: (userUuid , meetingUuid , authorizationUuid ) =>
|
|
3496
|
+
client.get(`${baseUrl}/guests/${userUuid}/meetings/${meetingUuid}/authorizations/${authorizationUuid}`, null),
|
|
3497
|
+
|
|
3345
3498
|
});
|
|
3346
3499
|
|
|
3347
3500
|
//
|
|
@@ -4780,6 +4933,14 @@ var calldMethods = (client , baseUrl ) => ({
|
|
|
4780
4933
|
getMeetingParticipantsAsUser: async (meetingUuid ) =>
|
|
4781
4934
|
client.get(`${baseUrl}/users/me/meetings/${meetingUuid}/participants`),
|
|
4782
4935
|
|
|
4936
|
+
banMeetingParticipant: (meetingUuid , participantUuid ) =>
|
|
4937
|
+
client.delete(
|
|
4938
|
+
`${baseUrl}/users/me/meetings/${meetingUuid}/participants/${participantUuid}`,
|
|
4939
|
+
null,
|
|
4940
|
+
null,
|
|
4941
|
+
ApiRequester.successResponseParser,
|
|
4942
|
+
),
|
|
4943
|
+
|
|
4783
4944
|
listTrunks: () => client.get(`${baseUrl}/trunks`),
|
|
4784
4945
|
|
|
4785
4946
|
mute: (callId ) =>
|
|
@@ -6420,7 +6581,7 @@ class WebRTCClient extends Emitter {
|
|
|
6420
6581
|
});
|
|
6421
6582
|
}
|
|
6422
6583
|
|
|
6423
|
-
changeAudioInputDevice(id , session , force ) {
|
|
6584
|
+
async changeAudioInputDevice(id , session , force ) {
|
|
6424
6585
|
const currentId = this.getAudioDeviceId();
|
|
6425
6586
|
logger.info('setting audio input device', { id, currentId, session: !!session });
|
|
6426
6587
|
|
|
@@ -6428,33 +6589,50 @@ class WebRTCClient extends Emitter {
|
|
|
6428
6589
|
return null;
|
|
6429
6590
|
}
|
|
6430
6591
|
|
|
6592
|
+
// in order to handle an audio track change for default devices
|
|
6593
|
+
// we need the actual id of the device (not 'default')
|
|
6594
|
+
let deviceId = id;
|
|
6595
|
+
if (id === 'default' && navigator.mediaDevices) {
|
|
6596
|
+
const devices = await navigator.mediaDevices.enumerateDevices();
|
|
6597
|
+
const defaultDevice = devices.find(device => device.deviceId === 'default');
|
|
6598
|
+
if (defaultDevice) {
|
|
6599
|
+
const deviceLabel = defaultDevice.label.replace('Default - ', '');
|
|
6600
|
+
const targetDevice = devices.find(device => device.label === deviceLabel);
|
|
6601
|
+
if (targetDevice) {
|
|
6602
|
+
deviceId = targetDevice.deviceId;
|
|
6603
|
+
if (!force && deviceId === currentId) {
|
|
6604
|
+
return null;
|
|
6605
|
+
}
|
|
6606
|
+
}
|
|
6607
|
+
}
|
|
6608
|
+
}
|
|
6609
|
+
|
|
6431
6610
|
// let's update the local audio value
|
|
6432
6611
|
if (this.audio) {
|
|
6433
6612
|
this.audio = {
|
|
6434
6613
|
deviceId: {
|
|
6435
|
-
exact:
|
|
6614
|
+
exact: deviceId,
|
|
6436
6615
|
},
|
|
6437
6616
|
};
|
|
6438
6617
|
}
|
|
6439
6618
|
|
|
6440
|
-
if (session) {
|
|
6619
|
+
if (session && navigator.mediaDevices) {
|
|
6441
6620
|
const sdh = session.sessionDescriptionHandler;
|
|
6442
6621
|
const pc = sdh.peerConnection;
|
|
6443
6622
|
|
|
6444
|
-
|
|
6445
|
-
|
|
6446
|
-
|
|
6447
|
-
|
|
6623
|
+
const constraints = { audio: { deviceId: { exact: deviceId } } };
|
|
6624
|
+
const stream = await navigator.mediaDevices.getUserMedia(constraints);
|
|
6625
|
+
const audioTrack = stream.getAudioTracks()[0];
|
|
6626
|
+
const sender = pc && pc.getSenders().find(s => audioTrack && s && s.track && s.track.kind === audioTrack.kind);
|
|
6448
6627
|
|
|
6449
|
-
|
|
6450
|
-
|
|
6451
|
-
|
|
6452
|
-
}
|
|
6453
|
-
sender.replaceTrack(audioTrack);
|
|
6628
|
+
if (sender) {
|
|
6629
|
+
if (sender.track) {
|
|
6630
|
+
audioTrack.enabled = sender.track.enabled;
|
|
6454
6631
|
}
|
|
6632
|
+
sender.replaceTrack(audioTrack);
|
|
6633
|
+
}
|
|
6455
6634
|
|
|
6456
|
-
|
|
6457
|
-
});
|
|
6635
|
+
return stream;
|
|
6458
6636
|
}
|
|
6459
6637
|
}
|
|
6460
6638
|
|
|
@@ -6474,14 +6652,14 @@ class WebRTCClient extends Emitter {
|
|
|
6474
6652
|
return null;
|
|
6475
6653
|
}
|
|
6476
6654
|
|
|
6477
|
-
// let's
|
|
6478
|
-
|
|
6479
|
-
|
|
6480
|
-
|
|
6481
|
-
|
|
6482
|
-
|
|
6483
|
-
}
|
|
6484
|
-
}
|
|
6655
|
+
// let's make sure we don't lose other video constraints settings -- width, height, frameRate...
|
|
6656
|
+
const videoObject = typeof this.video === 'object' ? this.video : {};
|
|
6657
|
+
this.video = {
|
|
6658
|
+
...videoObject,
|
|
6659
|
+
deviceId: {
|
|
6660
|
+
exact: id,
|
|
6661
|
+
},
|
|
6662
|
+
};
|
|
6485
6663
|
}
|
|
6486
6664
|
|
|
6487
6665
|
changeSessionVideoInputDevice(id , session ) {
|
|
@@ -7634,27 +7812,70 @@ describe('changeAudioInputDevice', () => {
|
|
|
7634
7812
|
});
|
|
7635
7813
|
});
|
|
7636
7814
|
|
|
7815
|
+
const devices = [
|
|
7816
|
+
{ deviceId: 'default', kind: 'audioinput', label: 'Default - Fake Microphone', groupId: 'fak3Gr0up3' },
|
|
7817
|
+
{ deviceId: 'fak3d3v1c3', kind: 'audioinput', label: 'Fake Microphone', groupId: 'fak3Gr0up3' },
|
|
7818
|
+
];
|
|
7819
|
+
const enumerateDevicesMock = jest.fn(async () => {
|
|
7820
|
+
return new Promise(resolve => {
|
|
7821
|
+
resolve(devices);
|
|
7822
|
+
});
|
|
7823
|
+
});
|
|
7824
|
+
|
|
7637
7825
|
Object.defineProperty(global.navigator, 'mediaDevices', {
|
|
7638
7826
|
value: {
|
|
7639
7827
|
getUserMedia: getUserMediaMock,
|
|
7828
|
+
enumerateDevices: enumerateDevicesMock,
|
|
7640
7829
|
},
|
|
7641
7830
|
});
|
|
7642
7831
|
|
|
7643
7832
|
it('should change the audio input track if the provided id is different', async () => {
|
|
7644
7833
|
client.setMediaConstraints(constraints);
|
|
7645
7834
|
expect(client.getAudioDeviceId()).toBe(defaultId);
|
|
7646
|
-
|
|
7835
|
+
const result = await client.changeAudioInputDevice(deviceId, session);
|
|
7836
|
+
expect(result).toBeTruthy();
|
|
7647
7837
|
});
|
|
7648
7838
|
|
|
7649
7839
|
it('should NOT change the audio input track if the provided id is the same', async () => {
|
|
7650
7840
|
client.setMediaConstraints(constraints);
|
|
7651
7841
|
expect(client.getAudioDeviceId()).toBe(defaultId);
|
|
7652
|
-
|
|
7842
|
+
const result = await client.changeAudioInputDevice(defaultId, session);
|
|
7843
|
+
expect(result).toBeFalsy();
|
|
7653
7844
|
});
|
|
7654
7845
|
|
|
7655
7846
|
it('should change the audio input track if the provided id is the same and force param is TRUE', async () => {
|
|
7656
7847
|
client.setMediaConstraints(constraints);
|
|
7657
7848
|
expect(client.getAudioDeviceId()).toBe(defaultId);
|
|
7658
|
-
|
|
7849
|
+
const result = await client.changeAudioInputDevice(defaultId, session, true);
|
|
7850
|
+
expect(result).toBeTruthy();
|
|
7851
|
+
});
|
|
7852
|
+
|
|
7853
|
+
describe('setVideoInputDevice', () => {
|
|
7854
|
+
it('should retain its original video values', () => {
|
|
7855
|
+
const video = { height: { min: 480, max: 720 }, width: { min: 640, max: 1280 } };
|
|
7856
|
+
|
|
7857
|
+
client.video = video;
|
|
7858
|
+
client.setVideoInputDevice(deviceId);
|
|
7859
|
+
expect(client.video).toEqual({ ...video, deviceId: { exact: deviceId } });
|
|
7860
|
+
});
|
|
7861
|
+
|
|
7862
|
+
it('should set deviceId when video\'s original value is true', () => {
|
|
7863
|
+
client.video = true;
|
|
7864
|
+
client.setVideoInputDevice(deviceId);
|
|
7865
|
+
expect(client.video).toEqual({ deviceId: { exact: deviceId } });
|
|
7866
|
+
});
|
|
7867
|
+
|
|
7868
|
+
it('should set deviceId when video\'s original value is not set', () => {
|
|
7869
|
+
client.video = undefined;
|
|
7870
|
+
client.setVideoInputDevice(deviceId);
|
|
7871
|
+
expect(client.video).toEqual({ deviceId: { exact: deviceId } });
|
|
7872
|
+
});
|
|
7873
|
+
|
|
7874
|
+
it('should NOT set deviceId when its value does not change', () => {
|
|
7875
|
+
client.video = { deviceId: { exact: deviceId } };
|
|
7876
|
+
const result = client.setVideoInputDevice(deviceId);
|
|
7877
|
+
expect(result).toEqual(null);
|
|
7878
|
+
expect(client.video).toEqual({ deviceId: { exact: deviceId } });
|
|
7879
|
+
});
|
|
7659
7880
|
});
|
|
7660
7881
|
});
|
package/esm/api/calld.js
CHANGED
|
@@ -1395,6 +1395,14 @@ var calld = (client , baseUrl ) => ({
|
|
|
1395
1395
|
getMeetingParticipantsAsUser: async (meetingUuid ) =>
|
|
1396
1396
|
client.get(`${baseUrl}/users/me/meetings/${meetingUuid}/participants`),
|
|
1397
1397
|
|
|
1398
|
+
banMeetingParticipant: (meetingUuid , participantUuid ) =>
|
|
1399
|
+
client.delete(
|
|
1400
|
+
`${baseUrl}/users/me/meetings/${meetingUuid}/participants/${participantUuid}`,
|
|
1401
|
+
null,
|
|
1402
|
+
null,
|
|
1403
|
+
ApiRequester.successResponseParser,
|
|
1404
|
+
),
|
|
1405
|
+
|
|
1398
1406
|
listTrunks: () => client.get(`${baseUrl}/trunks`),
|
|
1399
1407
|
|
|
1400
1408
|
mute: (callId ) =>
|