@wazo/sdk 0.38.7 → 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/dist/wazo-sdk.js +2 -2
- package/esm/__tests__/api-client.test.js +142 -2
- package/esm/__tests__/web-rtc-client.test.js +227 -27
- 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 +183 -24
- package/esm/checker/checks/aor.js +142 -2
- package/esm/checker/checks/api.js +142 -2
- package/esm/checker/checks/index.js +183 -24
- package/esm/checker/checks/wazo-websocket.js +2 -0
- package/esm/checker/checks/webrtc-transport.js +181 -24
- package/esm/checker/checks/webrtc.js +181 -24
- 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/__tests__/Meeting.test.js +87 -1
- package/esm/domain/__tests__/MeetingAuthorization.test.js +109 -0
- package/esm/index.js +226 -27
- package/esm/service/CallApi.js +142 -2
- package/esm/service/getApiClient.js +142 -2
- package/esm/simple/Auth.js +226 -27
- package/esm/simple/Configuration.js +226 -27
- package/esm/simple/Directory.js +142 -2
- package/esm/simple/Phone.js +226 -27
- package/esm/simple/Websocket.js +3 -0
- package/esm/simple/index.js +226 -27
- package/esm/simple/room/LocalParticipant.js +226 -27
- package/esm/simple/room/Participant.js +226 -27
- package/esm/simple/room/RemoteParticipant.js +226 -27
- package/esm/simple/room/Room.js +226 -27
- package/esm/simple/room/SipRoom.js +226 -27
- package/esm/simple/room/Stream.js +226 -27
- package/esm/simple/room/__tests__/Participant.test.js +14747 -0
- package/esm/simple/room/__tests__/RemoteParticipant.test.js +226 -27
- package/esm/simple/utils.js +226 -27
- package/esm/utils/__tests__/object.test.js +57 -0
- package/esm/utils/__tests__/string.test.js +30 -0
- package/esm/utils/object.js +24 -0
- package/esm/utils/string.js +10 -0
- package/esm/web-rtc-client.js +181 -24
- package/esm/websocket-client.js +3 -1
- package/lib/__tests__/api-client.test.js +142 -2
- package/lib/__tests__/web-rtc-client.test.js +227 -27
- 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 +183 -24
- package/lib/checker/checks/aor.js +142 -2
- package/lib/checker/checks/api.js +142 -2
- package/lib/checker/checks/index.js +183 -24
- package/lib/checker/checks/wazo-websocket.js +2 -0
- package/lib/checker/checks/webrtc-transport.js +181 -24
- package/lib/checker/checks/webrtc.js +181 -24
- 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/__tests__/Meeting.test.js +87 -1
- package/lib/domain/__tests__/MeetingAuthorization.test.js +111 -0
- package/lib/index.js +226 -27
- package/lib/service/CallApi.js +142 -2
- package/lib/service/getApiClient.js +142 -2
- package/lib/simple/Auth.js +226 -27
- package/lib/simple/Configuration.js +226 -27
- package/lib/simple/Directory.js +142 -2
- package/lib/simple/Phone.js +226 -27
- package/lib/simple/Websocket.js +3 -0
- package/lib/simple/index.js +226 -27
- package/lib/simple/room/LocalParticipant.js +226 -27
- package/lib/simple/room/Participant.js +226 -27
- package/lib/simple/room/RemoteParticipant.js +226 -27
- package/lib/simple/room/Room.js +226 -27
- package/lib/simple/room/SipRoom.js +226 -27
- package/lib/simple/room/Stream.js +226 -27
- package/lib/simple/room/__tests__/Participant.test.js +14757 -0
- package/lib/simple/room/__tests__/RemoteParticipant.test.js +226 -27
- package/lib/simple/utils.js +226 -27
- package/lib/utils/__tests__/object.test.js +59 -0
- package/lib/utils/__tests__/string.test.js +32 -0
- package/lib/utils/object.js +28 -0
- package/lib/utils/string.js +14 -0
- package/lib/web-rtc-client.js +181 -24
- 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/__tests__/Meeting.test.js +70 -1
- package/src/domain/__tests__/MeetingAuthorization.test.js +58 -0
- 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__/string.test.js +23 -0
- package/src/utils/object.js +15 -0
- package/src/utils/string.js +8 -0
- package/src/web-rtc-client.js +39 -22
- package/src/websocket-client.js +2 -0
|
@@ -2653,6 +2653,70 @@ class ExternalApp {
|
|
|
2653
2653
|
|
|
2654
2654
|
//
|
|
2655
2655
|
|
|
2656
|
+
class MeetingAuthorization {
|
|
2657
|
+
|
|
2658
|
+
|
|
2659
|
+
|
|
2660
|
+
|
|
2661
|
+
|
|
2662
|
+
|
|
2663
|
+
constructor({
|
|
2664
|
+
meetingUuid,
|
|
2665
|
+
uuid,
|
|
2666
|
+
userUuid,
|
|
2667
|
+
userName,
|
|
2668
|
+
} = {}) {
|
|
2669
|
+
this.meetingUuid = meetingUuid;
|
|
2670
|
+
this.uuid = uuid;
|
|
2671
|
+
this.userUuid = userUuid;
|
|
2672
|
+
this.userName = userName;
|
|
2673
|
+
}
|
|
2674
|
+
|
|
2675
|
+
setStatus(status ) {
|
|
2676
|
+
this.status = status;
|
|
2677
|
+
}
|
|
2678
|
+
|
|
2679
|
+
getStatus() {
|
|
2680
|
+
return this.status;
|
|
2681
|
+
}
|
|
2682
|
+
|
|
2683
|
+
static parse(plain ) {
|
|
2684
|
+
const {
|
|
2685
|
+
meeting_uuid: meetingUuid,
|
|
2686
|
+
uuid,
|
|
2687
|
+
guest_uuid: userUuid,
|
|
2688
|
+
guest_name: userName,
|
|
2689
|
+
} = plain;
|
|
2690
|
+
|
|
2691
|
+
return new MeetingAuthorization({
|
|
2692
|
+
meetingUuid,
|
|
2693
|
+
uuid,
|
|
2694
|
+
userUuid,
|
|
2695
|
+
userName,
|
|
2696
|
+
});
|
|
2697
|
+
}
|
|
2698
|
+
|
|
2699
|
+
static parseMany(items ) {
|
|
2700
|
+
if (!items) {
|
|
2701
|
+
return [];
|
|
2702
|
+
}
|
|
2703
|
+
return items.map(MeetingAuthorization.parse);
|
|
2704
|
+
}
|
|
2705
|
+
}
|
|
2706
|
+
|
|
2707
|
+
//
|
|
2708
|
+
|
|
2709
|
+
|
|
2710
|
+
|
|
2711
|
+
|
|
2712
|
+
|
|
2713
|
+
|
|
2714
|
+
|
|
2715
|
+
|
|
2716
|
+
|
|
2717
|
+
|
|
2718
|
+
|
|
2719
|
+
|
|
2656
2720
|
|
|
2657
2721
|
|
|
2658
2722
|
|
|
@@ -2663,6 +2727,7 @@ class ExternalApp {
|
|
|
2663
2727
|
|
|
2664
2728
|
|
|
2665
2729
|
|
|
2730
|
+
|
|
2666
2731
|
|
|
2667
2732
|
|
|
2668
2733
|
class Meeting {
|
|
@@ -2677,6 +2742,8 @@ class Meeting {
|
|
|
2677
2742
|
|
|
2678
2743
|
|
|
2679
2744
|
|
|
2745
|
+
|
|
2746
|
+
|
|
2680
2747
|
|
|
2681
2748
|
static parse(plain ) {
|
|
2682
2749
|
return new Meeting({
|
|
@@ -2689,6 +2756,7 @@ class Meeting {
|
|
|
2689
2756
|
extension: plain.exten,
|
|
2690
2757
|
persistent: plain.persistent,
|
|
2691
2758
|
creationTime: moment__default['default'](plain.creation_time).toDate(),
|
|
2759
|
+
requireAuthorization: plain.require_authorization,
|
|
2692
2760
|
});
|
|
2693
2761
|
}
|
|
2694
2762
|
|
|
@@ -2713,6 +2781,7 @@ class Meeting {
|
|
|
2713
2781
|
extension,
|
|
2714
2782
|
persistent,
|
|
2715
2783
|
creationTime,
|
|
2784
|
+
requireAuthorization,
|
|
2716
2785
|
} = {}) {
|
|
2717
2786
|
this.guestSipAuthorization = guestSipAuthorization;
|
|
2718
2787
|
this.uri = uri;
|
|
@@ -2723,6 +2792,7 @@ class Meeting {
|
|
|
2723
2792
|
this.extension = extension;
|
|
2724
2793
|
this.persistent = persistent;
|
|
2725
2794
|
this.creationTime = creationTime;
|
|
2795
|
+
this.requireAuthorization = requireAuthorization;
|
|
2726
2796
|
|
|
2727
2797
|
// Useful to compare instead of instanceof with minified code
|
|
2728
2798
|
this.type = 'Meeting';
|
|
@@ -2733,8 +2803,32 @@ class Meeting {
|
|
|
2733
2803
|
const [username, secret] = atob(this.guestSipAuthorization).split(':');
|
|
2734
2804
|
return { username, secret };
|
|
2735
2805
|
}
|
|
2806
|
+
|
|
2736
2807
|
}
|
|
2737
2808
|
|
|
2809
|
+
//
|
|
2810
|
+
|
|
2811
|
+
const camelToUnderscore = (key ) => {
|
|
2812
|
+
if (typeof key !== 'string') {
|
|
2813
|
+
throw new Error('Input is not a string');
|
|
2814
|
+
}
|
|
2815
|
+
return key.charAt(0).toLowerCase() + key.substring(1).replace(/([A-Z])/g, '_$1').toLowerCase();
|
|
2816
|
+
};
|
|
2817
|
+
|
|
2818
|
+
//
|
|
2819
|
+
|
|
2820
|
+
const convertKeysFromCamelToUnderscore = (args ) => {
|
|
2821
|
+
if (!args || typeof args !== 'object' || Array.isArray(args)) {
|
|
2822
|
+
throw new Error('Input is not an object');
|
|
2823
|
+
}
|
|
2824
|
+
|
|
2825
|
+
return Object.keys(args).reduce((acc, key) => {
|
|
2826
|
+
acc[camelToUnderscore(key)] = typeof args[key] === 'object' && !Array.isArray(args[key])
|
|
2827
|
+
? convertKeysFromCamelToUnderscore(args[key]) : args[key];
|
|
2828
|
+
return acc;
|
|
2829
|
+
}, {});
|
|
2830
|
+
};
|
|
2831
|
+
|
|
2738
2832
|
/* */
|
|
2739
2833
|
|
|
2740
2834
|
var confdMethods = (client , baseUrl ) => ({
|
|
@@ -2803,8 +2897,18 @@ var confdMethods = (client , baseUrl ) => ({
|
|
|
2803
2897
|
getMyMeetings: () =>
|
|
2804
2898
|
client.get(`${baseUrl}/users/me/meetings`).then(response => Meeting.parseMany(response.items)),
|
|
2805
2899
|
|
|
2806
|
-
createMyMeeting: (
|
|
2807
|
-
client
|
|
2900
|
+
createMyMeeting: (args ) =>
|
|
2901
|
+
client
|
|
2902
|
+
.post(`${baseUrl}/users/me/meetings`, convertKeysFromCamelToUnderscore(args))
|
|
2903
|
+
.then(Meeting.parse),
|
|
2904
|
+
|
|
2905
|
+
updateMyMeeting: (meetingUuid , data ) =>
|
|
2906
|
+
client.put(
|
|
2907
|
+
`${baseUrl}/users/me/meetings/${meetingUuid}`,
|
|
2908
|
+
convertKeysFromCamelToUnderscore(data),
|
|
2909
|
+
null,
|
|
2910
|
+
ApiRequester.successResponseParser,
|
|
2911
|
+
),
|
|
2808
2912
|
|
|
2809
2913
|
deleteMyMeeting: (meetingUuid ) =>
|
|
2810
2914
|
client.delete(`${baseUrl}/users/me/meetings/${meetingUuid}`, null),
|
|
@@ -2812,8 +2916,36 @@ var confdMethods = (client , baseUrl ) => ({
|
|
|
2812
2916
|
getMeeting: (meetingUuid ) =>
|
|
2813
2917
|
client.get(`${baseUrl}/meetings/${meetingUuid}`, null).then(Meeting.parse),
|
|
2814
2918
|
|
|
2919
|
+
meetingAuthorizations: (meetingUuid ) =>
|
|
2920
|
+
client.get(`${baseUrl}/users/me/meetings/${meetingUuid}/authorizations`, null).then(MeetingAuthorization.parseMany),
|
|
2921
|
+
|
|
2922
|
+
meetingAuthorizationReject: (meetingUuid , authorizationUuid ) =>
|
|
2923
|
+
client.put(
|
|
2924
|
+
`${baseUrl}/users/me/meetings/${meetingUuid}/authorizations/${authorizationUuid}/reject`,
|
|
2925
|
+
{},
|
|
2926
|
+
null,
|
|
2927
|
+
ApiRequester.successResponseParser,
|
|
2928
|
+
),
|
|
2929
|
+
|
|
2930
|
+
meetingAuthorizationAccept: (meetingUuid , authorizationUuid ) =>
|
|
2931
|
+
client.put(
|
|
2932
|
+
`${baseUrl}/users/me/meetings/${meetingUuid}/authorizations/${authorizationUuid}/accept`,
|
|
2933
|
+
{},
|
|
2934
|
+
null,
|
|
2935
|
+
ApiRequester.successResponseParser,
|
|
2936
|
+
),
|
|
2937
|
+
|
|
2815
2938
|
guestGetMeeting: (meetingUuid ) =>
|
|
2816
2939
|
client.get(`${baseUrl}/guests/me/meetings/${meetingUuid}`, null).then(Meeting.parse),
|
|
2940
|
+
|
|
2941
|
+
guestAuthorizationRequest: (userUuid , meetingUuid , username ) =>
|
|
2942
|
+
client
|
|
2943
|
+
.post(`${baseUrl}/guests/${userUuid}/meetings/${meetingUuid}/authorizations`, { guest_name: username })
|
|
2944
|
+
.then(MeetingAuthorization.parse),
|
|
2945
|
+
|
|
2946
|
+
guestAuthorizationCheck: (userUuid , meetingUuid , authorizationUuid ) =>
|
|
2947
|
+
client.get(`${baseUrl}/guests/${userUuid}/meetings/${meetingUuid}/authorizations/${authorizationUuid}`, null),
|
|
2948
|
+
|
|
2817
2949
|
});
|
|
2818
2950
|
|
|
2819
2951
|
//
|
|
@@ -4278,6 +4410,14 @@ var calldMethods = (client , baseUrl ) => ({
|
|
|
4278
4410
|
getMeetingParticipantsAsUser: async (meetingUuid ) =>
|
|
4279
4411
|
client.get(`${baseUrl}/users/me/meetings/${meetingUuid}/participants`),
|
|
4280
4412
|
|
|
4413
|
+
banMeetingParticipant: (meetingUuid , participantUuid ) =>
|
|
4414
|
+
client.delete(
|
|
4415
|
+
`${baseUrl}/users/me/meetings/${meetingUuid}/participants/${participantUuid}`,
|
|
4416
|
+
null,
|
|
4417
|
+
null,
|
|
4418
|
+
ApiRequester.successResponseParser,
|
|
4419
|
+
),
|
|
4420
|
+
|
|
4281
4421
|
listTrunks: () => client.get(`${baseUrl}/trunks`),
|
|
4282
4422
|
|
|
4283
4423
|
mute: (callId ) =>
|
|
@@ -5069,6 +5209,7 @@ const AGENT_UNPAUSED = 'agent_unpaused';
|
|
|
5069
5209
|
const CONFERENCE_ADHOC_PARTICIPANT_LEFT = 'conference_adhoc_participant_left';
|
|
5070
5210
|
const CONFERENCE_ADHOC_DELETED = 'conference_adhoc_deleted';
|
|
5071
5211
|
const MEETING_USER_PROGRESS = 'meeting_user_progress';
|
|
5212
|
+
const MEETING_USER_GUEST_AUTHORIZATION_CREATED = 'meeting_user_guest_authorization_created';
|
|
5072
5213
|
|
|
5073
5214
|
const BLACKLIST_EVENTS = [
|
|
5074
5215
|
CHAT_MESSAGE_SENT,
|
|
@@ -5420,6 +5561,7 @@ WebSocketClient.eventLists = [
|
|
|
5420
5561
|
CONFERENCE_ADHOC_PARTICIPANT_LEFT,
|
|
5421
5562
|
CONFERENCE_ADHOC_DELETED,
|
|
5422
5563
|
MEETING_USER_PROGRESS,
|
|
5564
|
+
MEETING_USER_GUEST_AUTHORIZATION_CREATED,
|
|
5423
5565
|
];
|
|
5424
5566
|
|
|
5425
5567
|
var wazoWebsocket = {
|
|
@@ -7036,7 +7178,7 @@ class WebRTCClient extends Emitter {
|
|
|
7036
7178
|
});
|
|
7037
7179
|
}
|
|
7038
7180
|
|
|
7039
|
-
changeAudioInputDevice(id , session , force ) {
|
|
7181
|
+
async changeAudioInputDevice(id , session , force ) {
|
|
7040
7182
|
const currentId = this.getAudioDeviceId();
|
|
7041
7183
|
logger.info('setting audio input device', { id, currentId, session: !!session });
|
|
7042
7184
|
|
|
@@ -7044,33 +7186,50 @@ class WebRTCClient extends Emitter {
|
|
|
7044
7186
|
return null;
|
|
7045
7187
|
}
|
|
7046
7188
|
|
|
7189
|
+
// in order to handle an audio track change for default devices
|
|
7190
|
+
// we need the actual id of the device (not 'default')
|
|
7191
|
+
let deviceId = id;
|
|
7192
|
+
if (id === 'default' && navigator.mediaDevices) {
|
|
7193
|
+
const devices = await navigator.mediaDevices.enumerateDevices();
|
|
7194
|
+
const defaultDevice = devices.find(device => device.deviceId === 'default');
|
|
7195
|
+
if (defaultDevice) {
|
|
7196
|
+
const deviceLabel = defaultDevice.label.replace('Default - ', '');
|
|
7197
|
+
const targetDevice = devices.find(device => device.label === deviceLabel);
|
|
7198
|
+
if (targetDevice) {
|
|
7199
|
+
deviceId = targetDevice.deviceId;
|
|
7200
|
+
if (!force && deviceId === currentId) {
|
|
7201
|
+
return null;
|
|
7202
|
+
}
|
|
7203
|
+
}
|
|
7204
|
+
}
|
|
7205
|
+
}
|
|
7206
|
+
|
|
7047
7207
|
// let's update the local audio value
|
|
7048
7208
|
if (this.audio) {
|
|
7049
7209
|
this.audio = {
|
|
7050
7210
|
deviceId: {
|
|
7051
|
-
exact:
|
|
7211
|
+
exact: deviceId,
|
|
7052
7212
|
},
|
|
7053
7213
|
};
|
|
7054
7214
|
}
|
|
7055
7215
|
|
|
7056
|
-
if (session) {
|
|
7216
|
+
if (session && navigator.mediaDevices) {
|
|
7057
7217
|
const sdh = session.sessionDescriptionHandler;
|
|
7058
7218
|
const pc = sdh.peerConnection;
|
|
7059
7219
|
|
|
7060
|
-
|
|
7061
|
-
|
|
7062
|
-
|
|
7063
|
-
|
|
7220
|
+
const constraints = { audio: { deviceId: { exact: deviceId } } };
|
|
7221
|
+
const stream = await navigator.mediaDevices.getUserMedia(constraints);
|
|
7222
|
+
const audioTrack = stream.getAudioTracks()[0];
|
|
7223
|
+
const sender = pc && pc.getSenders().find(s => audioTrack && s && s.track && s.track.kind === audioTrack.kind);
|
|
7064
7224
|
|
|
7065
|
-
|
|
7066
|
-
|
|
7067
|
-
|
|
7068
|
-
}
|
|
7069
|
-
sender.replaceTrack(audioTrack);
|
|
7225
|
+
if (sender) {
|
|
7226
|
+
if (sender.track) {
|
|
7227
|
+
audioTrack.enabled = sender.track.enabled;
|
|
7070
7228
|
}
|
|
7229
|
+
sender.replaceTrack(audioTrack);
|
|
7230
|
+
}
|
|
7071
7231
|
|
|
7072
|
-
|
|
7073
|
-
});
|
|
7232
|
+
return stream;
|
|
7074
7233
|
}
|
|
7075
7234
|
}
|
|
7076
7235
|
|
|
@@ -7090,14 +7249,14 @@ class WebRTCClient extends Emitter {
|
|
|
7090
7249
|
return null;
|
|
7091
7250
|
}
|
|
7092
7251
|
|
|
7093
|
-
// let's
|
|
7094
|
-
|
|
7095
|
-
|
|
7096
|
-
|
|
7097
|
-
|
|
7098
|
-
|
|
7099
|
-
}
|
|
7100
|
-
}
|
|
7252
|
+
// let's make sure we don't lose other video constraints settings -- width, height, frameRate...
|
|
7253
|
+
const videoObject = typeof this.video === 'object' ? this.video : {};
|
|
7254
|
+
this.video = {
|
|
7255
|
+
...videoObject,
|
|
7256
|
+
deviceId: {
|
|
7257
|
+
exact: id,
|
|
7258
|
+
},
|
|
7259
|
+
};
|
|
7101
7260
|
}
|
|
7102
7261
|
|
|
7103
7262
|
changeSessionVideoInputDevice(id , session ) {
|
|
@@ -615,6 +615,7 @@ const AGENT_UNPAUSED = 'agent_unpaused';
|
|
|
615
615
|
const CONFERENCE_ADHOC_PARTICIPANT_LEFT = 'conference_adhoc_participant_left';
|
|
616
616
|
const CONFERENCE_ADHOC_DELETED = 'conference_adhoc_deleted';
|
|
617
617
|
const MEETING_USER_PROGRESS = 'meeting_user_progress';
|
|
618
|
+
const MEETING_USER_GUEST_AUTHORIZATION_CREATED = 'meeting_user_guest_authorization_created';
|
|
618
619
|
|
|
619
620
|
const BLACKLIST_EVENTS = [
|
|
620
621
|
CHAT_MESSAGE_SENT,
|
|
@@ -966,6 +967,7 @@ WebSocketClient.eventLists = [
|
|
|
966
967
|
CONFERENCE_ADHOC_PARTICIPANT_LEFT,
|
|
967
968
|
CONFERENCE_ADHOC_DELETED,
|
|
968
969
|
MEETING_USER_PROGRESS,
|
|
970
|
+
MEETING_USER_GUEST_AUTHORIZATION_CREATED,
|
|
969
971
|
];
|
|
970
972
|
|
|
971
973
|
var wazoWebsocket = {
|
|
@@ -3211,6 +3211,70 @@ class ExternalApp {
|
|
|
3211
3211
|
|
|
3212
3212
|
//
|
|
3213
3213
|
|
|
3214
|
+
class MeetingAuthorization {
|
|
3215
|
+
|
|
3216
|
+
|
|
3217
|
+
|
|
3218
|
+
|
|
3219
|
+
|
|
3220
|
+
|
|
3221
|
+
constructor({
|
|
3222
|
+
meetingUuid,
|
|
3223
|
+
uuid,
|
|
3224
|
+
userUuid,
|
|
3225
|
+
userName,
|
|
3226
|
+
} = {}) {
|
|
3227
|
+
this.meetingUuid = meetingUuid;
|
|
3228
|
+
this.uuid = uuid;
|
|
3229
|
+
this.userUuid = userUuid;
|
|
3230
|
+
this.userName = userName;
|
|
3231
|
+
}
|
|
3232
|
+
|
|
3233
|
+
setStatus(status ) {
|
|
3234
|
+
this.status = status;
|
|
3235
|
+
}
|
|
3236
|
+
|
|
3237
|
+
getStatus() {
|
|
3238
|
+
return this.status;
|
|
3239
|
+
}
|
|
3240
|
+
|
|
3241
|
+
static parse(plain ) {
|
|
3242
|
+
const {
|
|
3243
|
+
meeting_uuid: meetingUuid,
|
|
3244
|
+
uuid,
|
|
3245
|
+
guest_uuid: userUuid,
|
|
3246
|
+
guest_name: userName,
|
|
3247
|
+
} = plain;
|
|
3248
|
+
|
|
3249
|
+
return new MeetingAuthorization({
|
|
3250
|
+
meetingUuid,
|
|
3251
|
+
uuid,
|
|
3252
|
+
userUuid,
|
|
3253
|
+
userName,
|
|
3254
|
+
});
|
|
3255
|
+
}
|
|
3256
|
+
|
|
3257
|
+
static parseMany(items ) {
|
|
3258
|
+
if (!items) {
|
|
3259
|
+
return [];
|
|
3260
|
+
}
|
|
3261
|
+
return items.map(MeetingAuthorization.parse);
|
|
3262
|
+
}
|
|
3263
|
+
}
|
|
3264
|
+
|
|
3265
|
+
//
|
|
3266
|
+
|
|
3267
|
+
|
|
3268
|
+
|
|
3269
|
+
|
|
3270
|
+
|
|
3271
|
+
|
|
3272
|
+
|
|
3273
|
+
|
|
3274
|
+
|
|
3275
|
+
|
|
3276
|
+
|
|
3277
|
+
|
|
3214
3278
|
|
|
3215
3279
|
|
|
3216
3280
|
|
|
@@ -3221,6 +3285,7 @@ class ExternalApp {
|
|
|
3221
3285
|
|
|
3222
3286
|
|
|
3223
3287
|
|
|
3288
|
+
|
|
3224
3289
|
|
|
3225
3290
|
|
|
3226
3291
|
class Meeting {
|
|
@@ -3235,6 +3300,8 @@ class Meeting {
|
|
|
3235
3300
|
|
|
3236
3301
|
|
|
3237
3302
|
|
|
3303
|
+
|
|
3304
|
+
|
|
3238
3305
|
|
|
3239
3306
|
static parse(plain ) {
|
|
3240
3307
|
return new Meeting({
|
|
@@ -3247,6 +3314,7 @@ class Meeting {
|
|
|
3247
3314
|
extension: plain.exten,
|
|
3248
3315
|
persistent: plain.persistent,
|
|
3249
3316
|
creationTime: moment__default['default'](plain.creation_time).toDate(),
|
|
3317
|
+
requireAuthorization: plain.require_authorization,
|
|
3250
3318
|
});
|
|
3251
3319
|
}
|
|
3252
3320
|
|
|
@@ -3271,6 +3339,7 @@ class Meeting {
|
|
|
3271
3339
|
extension,
|
|
3272
3340
|
persistent,
|
|
3273
3341
|
creationTime,
|
|
3342
|
+
requireAuthorization,
|
|
3274
3343
|
} = {}) {
|
|
3275
3344
|
this.guestSipAuthorization = guestSipAuthorization;
|
|
3276
3345
|
this.uri = uri;
|
|
@@ -3281,6 +3350,7 @@ class Meeting {
|
|
|
3281
3350
|
this.extension = extension;
|
|
3282
3351
|
this.persistent = persistent;
|
|
3283
3352
|
this.creationTime = creationTime;
|
|
3353
|
+
this.requireAuthorization = requireAuthorization;
|
|
3284
3354
|
|
|
3285
3355
|
// Useful to compare instead of instanceof with minified code
|
|
3286
3356
|
this.type = 'Meeting';
|
|
@@ -3291,8 +3361,32 @@ class Meeting {
|
|
|
3291
3361
|
const [username, secret] = atob(this.guestSipAuthorization).split(':');
|
|
3292
3362
|
return { username, secret };
|
|
3293
3363
|
}
|
|
3364
|
+
|
|
3294
3365
|
}
|
|
3295
3366
|
|
|
3367
|
+
//
|
|
3368
|
+
|
|
3369
|
+
const camelToUnderscore = (key ) => {
|
|
3370
|
+
if (typeof key !== 'string') {
|
|
3371
|
+
throw new Error('Input is not a string');
|
|
3372
|
+
}
|
|
3373
|
+
return key.charAt(0).toLowerCase() + key.substring(1).replace(/([A-Z])/g, '_$1').toLowerCase();
|
|
3374
|
+
};
|
|
3375
|
+
|
|
3376
|
+
//
|
|
3377
|
+
|
|
3378
|
+
const convertKeysFromCamelToUnderscore = (args ) => {
|
|
3379
|
+
if (!args || typeof args !== 'object' || Array.isArray(args)) {
|
|
3380
|
+
throw new Error('Input is not an object');
|
|
3381
|
+
}
|
|
3382
|
+
|
|
3383
|
+
return Object.keys(args).reduce((acc, key) => {
|
|
3384
|
+
acc[camelToUnderscore(key)] = typeof args[key] === 'object' && !Array.isArray(args[key])
|
|
3385
|
+
? convertKeysFromCamelToUnderscore(args[key]) : args[key];
|
|
3386
|
+
return acc;
|
|
3387
|
+
}, {});
|
|
3388
|
+
};
|
|
3389
|
+
|
|
3296
3390
|
/* */
|
|
3297
3391
|
|
|
3298
3392
|
var confdMethods = (client , baseUrl ) => ({
|
|
@@ -3361,8 +3455,18 @@ var confdMethods = (client , baseUrl ) => ({
|
|
|
3361
3455
|
getMyMeetings: () =>
|
|
3362
3456
|
client.get(`${baseUrl}/users/me/meetings`).then(response => Meeting.parseMany(response.items)),
|
|
3363
3457
|
|
|
3364
|
-
createMyMeeting: (
|
|
3365
|
-
client
|
|
3458
|
+
createMyMeeting: (args ) =>
|
|
3459
|
+
client
|
|
3460
|
+
.post(`${baseUrl}/users/me/meetings`, convertKeysFromCamelToUnderscore(args))
|
|
3461
|
+
.then(Meeting.parse),
|
|
3462
|
+
|
|
3463
|
+
updateMyMeeting: (meetingUuid , data ) =>
|
|
3464
|
+
client.put(
|
|
3465
|
+
`${baseUrl}/users/me/meetings/${meetingUuid}`,
|
|
3466
|
+
convertKeysFromCamelToUnderscore(data),
|
|
3467
|
+
null,
|
|
3468
|
+
ApiRequester.successResponseParser,
|
|
3469
|
+
),
|
|
3366
3470
|
|
|
3367
3471
|
deleteMyMeeting: (meetingUuid ) =>
|
|
3368
3472
|
client.delete(`${baseUrl}/users/me/meetings/${meetingUuid}`, null),
|
|
@@ -3370,8 +3474,36 @@ var confdMethods = (client , baseUrl ) => ({
|
|
|
3370
3474
|
getMeeting: (meetingUuid ) =>
|
|
3371
3475
|
client.get(`${baseUrl}/meetings/${meetingUuid}`, null).then(Meeting.parse),
|
|
3372
3476
|
|
|
3477
|
+
meetingAuthorizations: (meetingUuid ) =>
|
|
3478
|
+
client.get(`${baseUrl}/users/me/meetings/${meetingUuid}/authorizations`, null).then(MeetingAuthorization.parseMany),
|
|
3479
|
+
|
|
3480
|
+
meetingAuthorizationReject: (meetingUuid , authorizationUuid ) =>
|
|
3481
|
+
client.put(
|
|
3482
|
+
`${baseUrl}/users/me/meetings/${meetingUuid}/authorizations/${authorizationUuid}/reject`,
|
|
3483
|
+
{},
|
|
3484
|
+
null,
|
|
3485
|
+
ApiRequester.successResponseParser,
|
|
3486
|
+
),
|
|
3487
|
+
|
|
3488
|
+
meetingAuthorizationAccept: (meetingUuid , authorizationUuid ) =>
|
|
3489
|
+
client.put(
|
|
3490
|
+
`${baseUrl}/users/me/meetings/${meetingUuid}/authorizations/${authorizationUuid}/accept`,
|
|
3491
|
+
{},
|
|
3492
|
+
null,
|
|
3493
|
+
ApiRequester.successResponseParser,
|
|
3494
|
+
),
|
|
3495
|
+
|
|
3373
3496
|
guestGetMeeting: (meetingUuid ) =>
|
|
3374
3497
|
client.get(`${baseUrl}/guests/me/meetings/${meetingUuid}`, null).then(Meeting.parse),
|
|
3498
|
+
|
|
3499
|
+
guestAuthorizationRequest: (userUuid , meetingUuid , username ) =>
|
|
3500
|
+
client
|
|
3501
|
+
.post(`${baseUrl}/guests/${userUuid}/meetings/${meetingUuid}/authorizations`, { guest_name: username })
|
|
3502
|
+
.then(MeetingAuthorization.parse),
|
|
3503
|
+
|
|
3504
|
+
guestAuthorizationCheck: (userUuid , meetingUuid , authorizationUuid ) =>
|
|
3505
|
+
client.get(`${baseUrl}/guests/${userUuid}/meetings/${meetingUuid}/authorizations/${authorizationUuid}`, null),
|
|
3506
|
+
|
|
3375
3507
|
});
|
|
3376
3508
|
|
|
3377
3509
|
//
|
|
@@ -4810,6 +4942,14 @@ var calldMethods = (client , baseUrl ) => ({
|
|
|
4810
4942
|
getMeetingParticipantsAsUser: async (meetingUuid ) =>
|
|
4811
4943
|
client.get(`${baseUrl}/users/me/meetings/${meetingUuid}/participants`),
|
|
4812
4944
|
|
|
4945
|
+
banMeetingParticipant: (meetingUuid , participantUuid ) =>
|
|
4946
|
+
client.delete(
|
|
4947
|
+
`${baseUrl}/users/me/meetings/${meetingUuid}/participants/${participantUuid}`,
|
|
4948
|
+
null,
|
|
4949
|
+
null,
|
|
4950
|
+
ApiRequester.successResponseParser,
|
|
4951
|
+
),
|
|
4952
|
+
|
|
4813
4953
|
listTrunks: () => client.get(`${baseUrl}/trunks`),
|
|
4814
4954
|
|
|
4815
4955
|
mute: (callId ) =>
|
|
@@ -6450,7 +6590,7 @@ class WebRTCClient extends Emitter {
|
|
|
6450
6590
|
});
|
|
6451
6591
|
}
|
|
6452
6592
|
|
|
6453
|
-
changeAudioInputDevice(id , session , force ) {
|
|
6593
|
+
async changeAudioInputDevice(id , session , force ) {
|
|
6454
6594
|
const currentId = this.getAudioDeviceId();
|
|
6455
6595
|
logger.info('setting audio input device', { id, currentId, session: !!session });
|
|
6456
6596
|
|
|
@@ -6458,33 +6598,50 @@ class WebRTCClient extends Emitter {
|
|
|
6458
6598
|
return null;
|
|
6459
6599
|
}
|
|
6460
6600
|
|
|
6601
|
+
// in order to handle an audio track change for default devices
|
|
6602
|
+
// we need the actual id of the device (not 'default')
|
|
6603
|
+
let deviceId = id;
|
|
6604
|
+
if (id === 'default' && navigator.mediaDevices) {
|
|
6605
|
+
const devices = await navigator.mediaDevices.enumerateDevices();
|
|
6606
|
+
const defaultDevice = devices.find(device => device.deviceId === 'default');
|
|
6607
|
+
if (defaultDevice) {
|
|
6608
|
+
const deviceLabel = defaultDevice.label.replace('Default - ', '');
|
|
6609
|
+
const targetDevice = devices.find(device => device.label === deviceLabel);
|
|
6610
|
+
if (targetDevice) {
|
|
6611
|
+
deviceId = targetDevice.deviceId;
|
|
6612
|
+
if (!force && deviceId === currentId) {
|
|
6613
|
+
return null;
|
|
6614
|
+
}
|
|
6615
|
+
}
|
|
6616
|
+
}
|
|
6617
|
+
}
|
|
6618
|
+
|
|
6461
6619
|
// let's update the local audio value
|
|
6462
6620
|
if (this.audio) {
|
|
6463
6621
|
this.audio = {
|
|
6464
6622
|
deviceId: {
|
|
6465
|
-
exact:
|
|
6623
|
+
exact: deviceId,
|
|
6466
6624
|
},
|
|
6467
6625
|
};
|
|
6468
6626
|
}
|
|
6469
6627
|
|
|
6470
|
-
if (session) {
|
|
6628
|
+
if (session && navigator.mediaDevices) {
|
|
6471
6629
|
const sdh = session.sessionDescriptionHandler;
|
|
6472
6630
|
const pc = sdh.peerConnection;
|
|
6473
6631
|
|
|
6474
|
-
|
|
6475
|
-
|
|
6476
|
-
|
|
6477
|
-
|
|
6632
|
+
const constraints = { audio: { deviceId: { exact: deviceId } } };
|
|
6633
|
+
const stream = await navigator.mediaDevices.getUserMedia(constraints);
|
|
6634
|
+
const audioTrack = stream.getAudioTracks()[0];
|
|
6635
|
+
const sender = pc && pc.getSenders().find(s => audioTrack && s && s.track && s.track.kind === audioTrack.kind);
|
|
6478
6636
|
|
|
6479
|
-
|
|
6480
|
-
|
|
6481
|
-
|
|
6482
|
-
}
|
|
6483
|
-
sender.replaceTrack(audioTrack);
|
|
6637
|
+
if (sender) {
|
|
6638
|
+
if (sender.track) {
|
|
6639
|
+
audioTrack.enabled = sender.track.enabled;
|
|
6484
6640
|
}
|
|
6641
|
+
sender.replaceTrack(audioTrack);
|
|
6642
|
+
}
|
|
6485
6643
|
|
|
6486
|
-
|
|
6487
|
-
});
|
|
6644
|
+
return stream;
|
|
6488
6645
|
}
|
|
6489
6646
|
}
|
|
6490
6647
|
|
|
@@ -6504,14 +6661,14 @@ class WebRTCClient extends Emitter {
|
|
|
6504
6661
|
return null;
|
|
6505
6662
|
}
|
|
6506
6663
|
|
|
6507
|
-
// let's
|
|
6508
|
-
|
|
6509
|
-
|
|
6510
|
-
|
|
6511
|
-
|
|
6512
|
-
|
|
6513
|
-
}
|
|
6514
|
-
}
|
|
6664
|
+
// let's make sure we don't lose other video constraints settings -- width, height, frameRate...
|
|
6665
|
+
const videoObject = typeof this.video === 'object' ? this.video : {};
|
|
6666
|
+
this.video = {
|
|
6667
|
+
...videoObject,
|
|
6668
|
+
deviceId: {
|
|
6669
|
+
exact: id,
|
|
6670
|
+
},
|
|
6671
|
+
};
|
|
6515
6672
|
}
|
|
6516
6673
|
|
|
6517
6674
|
changeSessionVideoInputDevice(id , session ) {
|