@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
package/esm/simple/utils.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
|
//
|
|
@@ -5056,6 +5188,14 @@ var calldMethods = (client , baseUrl ) => ({
|
|
|
5056
5188
|
getMeetingParticipantsAsUser: async (meetingUuid ) =>
|
|
5057
5189
|
client.get(`${baseUrl}/users/me/meetings/${meetingUuid}/participants`),
|
|
5058
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
|
+
|
|
5059
5199
|
listTrunks: () => client.get(`${baseUrl}/trunks`),
|
|
5060
5200
|
|
|
5061
5201
|
mute: (callId ) =>
|
|
@@ -7814,7 +7954,7 @@ class WebRTCClient extends Emitter {
|
|
|
7814
7954
|
});
|
|
7815
7955
|
}
|
|
7816
7956
|
|
|
7817
|
-
changeAudioInputDevice(id , session , force ) {
|
|
7957
|
+
async changeAudioInputDevice(id , session , force ) {
|
|
7818
7958
|
const currentId = this.getAudioDeviceId();
|
|
7819
7959
|
logger$8.info('setting audio input device', { id, currentId, session: !!session });
|
|
7820
7960
|
|
|
@@ -7822,33 +7962,50 @@ class WebRTCClient extends Emitter {
|
|
|
7822
7962
|
return null;
|
|
7823
7963
|
}
|
|
7824
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
|
+
|
|
7825
7983
|
// let's update the local audio value
|
|
7826
7984
|
if (this.audio) {
|
|
7827
7985
|
this.audio = {
|
|
7828
7986
|
deviceId: {
|
|
7829
|
-
exact:
|
|
7987
|
+
exact: deviceId,
|
|
7830
7988
|
},
|
|
7831
7989
|
};
|
|
7832
7990
|
}
|
|
7833
7991
|
|
|
7834
|
-
if (session) {
|
|
7992
|
+
if (session && navigator.mediaDevices) {
|
|
7835
7993
|
const sdh = session.sessionDescriptionHandler;
|
|
7836
7994
|
const pc = sdh.peerConnection;
|
|
7837
7995
|
|
|
7838
|
-
|
|
7839
|
-
|
|
7840
|
-
|
|
7841
|
-
|
|
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);
|
|
7842
8000
|
|
|
7843
|
-
|
|
7844
|
-
|
|
7845
|
-
|
|
7846
|
-
}
|
|
7847
|
-
sender.replaceTrack(audioTrack);
|
|
8001
|
+
if (sender) {
|
|
8002
|
+
if (sender.track) {
|
|
8003
|
+
audioTrack.enabled = sender.track.enabled;
|
|
7848
8004
|
}
|
|
8005
|
+
sender.replaceTrack(audioTrack);
|
|
8006
|
+
}
|
|
7849
8007
|
|
|
7850
|
-
|
|
7851
|
-
});
|
|
8008
|
+
return stream;
|
|
7852
8009
|
}
|
|
7853
8010
|
}
|
|
7854
8011
|
|
|
@@ -7868,14 +8025,14 @@ class WebRTCClient extends Emitter {
|
|
|
7868
8025
|
return null;
|
|
7869
8026
|
}
|
|
7870
8027
|
|
|
7871
|
-
// let's
|
|
7872
|
-
|
|
7873
|
-
|
|
7874
|
-
|
|
7875
|
-
|
|
7876
|
-
|
|
7877
|
-
}
|
|
7878
|
-
}
|
|
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
|
+
};
|
|
7879
8036
|
}
|
|
7880
8037
|
|
|
7881
8038
|
changeSessionVideoInputDevice(id , session ) {
|
|
@@ -11270,6 +11427,7 @@ const AGENT_UNPAUSED = 'agent_unpaused';
|
|
|
11270
11427
|
const CONFERENCE_ADHOC_PARTICIPANT_LEFT = 'conference_adhoc_participant_left';
|
|
11271
11428
|
const CONFERENCE_ADHOC_DELETED = 'conference_adhoc_deleted';
|
|
11272
11429
|
const MEETING_USER_PROGRESS = 'meeting_user_progress';
|
|
11430
|
+
const MEETING_USER_GUEST_AUTHORIZATION_CREATED = 'meeting_user_guest_authorization_created';
|
|
11273
11431
|
|
|
11274
11432
|
const BLACKLIST_EVENTS = [
|
|
11275
11433
|
CHAT_MESSAGE_SENT,
|
|
@@ -11621,6 +11779,7 @@ WebSocketClient.eventLists = [
|
|
|
11621
11779
|
CONFERENCE_ADHOC_PARTICIPANT_LEFT,
|
|
11622
11780
|
CONFERENCE_ADHOC_DELETED,
|
|
11623
11781
|
MEETING_USER_PROGRESS,
|
|
11782
|
+
MEETING_USER_GUEST_AUTHORIZATION_CREATED,
|
|
11624
11783
|
];
|
|
11625
11784
|
|
|
11626
11785
|
var WebSocketClient$1 = /*#__PURE__*/Object.freeze({
|
|
@@ -11692,6 +11851,7 @@ var WebSocketClient$1 = /*#__PURE__*/Object.freeze({
|
|
|
11692
11851
|
CONFERENCE_ADHOC_PARTICIPANT_LEFT: CONFERENCE_ADHOC_PARTICIPANT_LEFT,
|
|
11693
11852
|
CONFERENCE_ADHOC_DELETED: CONFERENCE_ADHOC_DELETED,
|
|
11694
11853
|
MEETING_USER_PROGRESS: MEETING_USER_PROGRESS,
|
|
11854
|
+
MEETING_USER_GUEST_AUTHORIZATION_CREATED: MEETING_USER_GUEST_AUTHORIZATION_CREATED,
|
|
11695
11855
|
HEARTBEAT_ENGINE_VERSION: HEARTBEAT_ENGINE_VERSION,
|
|
11696
11856
|
'default': WebSocketClient
|
|
11697
11857
|
});
|
|
@@ -11796,6 +11956,7 @@ class Participant extends Emitter {
|
|
|
11796
11956
|
|
|
11797
11957
|
|
|
11798
11958
|
|
|
11959
|
+
|
|
11799
11960
|
|
|
11800
11961
|
|
|
11801
11962
|
|
|
@@ -11813,6 +11974,7 @@ class Participant extends Emitter {
|
|
|
11813
11974
|
|
|
11814
11975
|
|
|
11815
11976
|
|
|
11977
|
+
|
|
11816
11978
|
|
|
11817
11979
|
/**
|
|
11818
11980
|
* @param room Room The room where the participant is
|
|
@@ -11836,6 +11998,7 @@ class Participant extends Emitter {
|
|
|
11836
11998
|
this.screensharing = false;
|
|
11837
11999
|
this.isOnHold = false;
|
|
11838
12000
|
this.extra = extra;
|
|
12001
|
+
this.banned = false;
|
|
11839
12002
|
|
|
11840
12003
|
this.ON_UPDATED = 'participant/ON_UPDATED';
|
|
11841
12004
|
this.ON_START_TALKING = 'participant/ON_START_TALKING';
|
|
@@ -11852,6 +12015,7 @@ class Participant extends Emitter {
|
|
|
11852
12015
|
this.ON_EXTRA_CHANGE = 'participant/ON_EXTRA_CHANGE';
|
|
11853
12016
|
this.ON_HOLD = 'participant/ON_HOLD';
|
|
11854
12017
|
this.ON_RESUME = 'participant/ON_RESUME';
|
|
12018
|
+
this.ON_BAN = 'participant/ON_BAN';
|
|
11855
12019
|
}
|
|
11856
12020
|
|
|
11857
12021
|
triggerEvent(name , ...args ) {
|
|
@@ -11892,6 +12056,10 @@ class Participant extends Emitter {
|
|
|
11892
12056
|
status.extra = this.extra;
|
|
11893
12057
|
break;
|
|
11894
12058
|
}
|
|
12059
|
+
case this.ON_BAN: {
|
|
12060
|
+
status.banned = true;
|
|
12061
|
+
break;
|
|
12062
|
+
}
|
|
11895
12063
|
}
|
|
11896
12064
|
|
|
11897
12065
|
if (broadcast) {
|
|
@@ -11994,6 +12162,11 @@ class Participant extends Emitter {
|
|
|
11994
12162
|
this.triggerUpdate(this.ON_RESUME, broadcast);
|
|
11995
12163
|
}
|
|
11996
12164
|
|
|
12165
|
+
onBan(broadcast = true) {
|
|
12166
|
+
this.banned = true;
|
|
12167
|
+
this.triggerUpdate(this.ON_BAN, broadcast);
|
|
12168
|
+
}
|
|
12169
|
+
|
|
11997
12170
|
getStatus() {
|
|
11998
12171
|
return {
|
|
11999
12172
|
callId: this.callId,
|
|
@@ -12040,6 +12213,10 @@ class Participant extends Emitter {
|
|
|
12040
12213
|
}
|
|
12041
12214
|
}
|
|
12042
12215
|
|
|
12216
|
+
if (status.banned) {
|
|
12217
|
+
this.onBan(false);
|
|
12218
|
+
}
|
|
12219
|
+
|
|
12043
12220
|
// Poor man's object comparison
|
|
12044
12221
|
if (typeof status.extra !== 'undefined' && JSON.stringify(this.extra) !== JSON.stringify(status.extra)) {
|
|
12045
12222
|
this.extra = { ...this.extra, ...status.extra };
|
|
@@ -12067,6 +12244,28 @@ class Participant extends Emitter {
|
|
|
12067
12244
|
this.streams = streams;
|
|
12068
12245
|
this.videoStreams = streams;
|
|
12069
12246
|
}
|
|
12247
|
+
|
|
12248
|
+
async ban(apiRequestDelay = null) {
|
|
12249
|
+
const { meetingUuid } = this.room;
|
|
12250
|
+
if (!meetingUuid) {
|
|
12251
|
+
throw new Error('Attempting to ban a participant without a `meetingUuid`');
|
|
12252
|
+
}
|
|
12253
|
+
|
|
12254
|
+
// this notifies all that someone is being banned
|
|
12255
|
+
this.onBan(true);
|
|
12256
|
+
|
|
12257
|
+
// this allows to delay the actual ban, in order for the banned participant as well as others to react to the situation
|
|
12258
|
+
if (apiRequestDelay) {
|
|
12259
|
+
await this.delay(apiRequestDelay);
|
|
12260
|
+
}
|
|
12261
|
+
|
|
12262
|
+
// proceed with the actual kick
|
|
12263
|
+
return getApiClient().calld.banMeetingParticipant(meetingUuid, this.callId);
|
|
12264
|
+
}
|
|
12265
|
+
|
|
12266
|
+
async delay(ms ) {
|
|
12267
|
+
return new Promise(resolve => setTimeout(resolve, ms));
|
|
12268
|
+
}
|
|
12070
12269
|
}
|
|
12071
12270
|
|
|
12072
12271
|
//
|
|
@@ -12219,7 +12418,7 @@ class Room$1 extends Emitter {
|
|
|
12219
12418
|
logger$2.info('connecting to room', { extension, audioOnly, room: !!room });
|
|
12220
12419
|
|
|
12221
12420
|
if (!room) {
|
|
12222
|
-
await Wazo.Phone.connect();
|
|
12421
|
+
await Wazo.Phone.connect({ media: constraints });
|
|
12223
12422
|
|
|
12224
12423
|
const withCamera = constraints && !!constraints.video;
|
|
12225
12424
|
|
|
@@ -12664,7 +12863,7 @@ class Room$1 extends Emitter {
|
|
|
12664
12863
|
const participant = this._getParticipantFromCallId(status.callId);
|
|
12665
12864
|
|
|
12666
12865
|
if (participant) {
|
|
12667
|
-
// we're
|
|
12866
|
+
// we're receiving, so no need to broadcast
|
|
12668
12867
|
participant.updateStatus(status, false);
|
|
12669
12868
|
}
|
|
12670
12869
|
break;
|
|
@@ -12931,7 +13130,7 @@ class SipRoom extends Room$1 {
|
|
|
12931
13130
|
logger$1.info('connecting to sip room', { extension, audioOnly, room: !!room });
|
|
12932
13131
|
|
|
12933
13132
|
if (!room) {
|
|
12934
|
-
await Wazo.Phone.connect();
|
|
13133
|
+
await Wazo.Phone.connect({ media: constraints });
|
|
12935
13134
|
|
|
12936
13135
|
const withCamera = constraints && !!constraints.video;
|
|
12937
13136
|
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
//
|
|
2
|
+
|
|
3
|
+
const camelToUnderscore = (key ) => {
|
|
4
|
+
if (typeof key !== 'string') {
|
|
5
|
+
throw new Error('Input is not a string');
|
|
6
|
+
}
|
|
7
|
+
return key.charAt(0).toLowerCase() + key.substring(1).replace(/([A-Z])/g, '_$1').toLowerCase();
|
|
8
|
+
};
|
|
9
|
+
|
|
10
|
+
//
|
|
11
|
+
|
|
12
|
+
const convertKeysFromCamelToUnderscore = (args ) => {
|
|
13
|
+
if (!args || typeof args !== 'object' || Array.isArray(args)) {
|
|
14
|
+
throw new Error('Input is not an object');
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
return Object.keys(args).reduce((acc, key) => {
|
|
18
|
+
acc[camelToUnderscore(key)] = typeof args[key] === 'object' && !Array.isArray(args[key])
|
|
19
|
+
? convertKeysFromCamelToUnderscore(args[key]) : args[key];
|
|
20
|
+
return acc;
|
|
21
|
+
}, {});
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
//
|
|
25
|
+
|
|
26
|
+
describe('object utils', () => {
|
|
27
|
+
describe('convertKeysFromCamelToUnderscore', () => {
|
|
28
|
+
it('should throw an error when input is not an object', () => {
|
|
29
|
+
const msg = 'Input is not an object';
|
|
30
|
+
expect(() => convertKeysFromCamelToUnderscore(true)).toThrow(msg);
|
|
31
|
+
expect(() => convertKeysFromCamelToUnderscore(null)).toThrow(msg);
|
|
32
|
+
expect(() => convertKeysFromCamelToUnderscore(undefined)).toThrow(msg);
|
|
33
|
+
expect(() => convertKeysFromCamelToUnderscore([])).toThrow(msg);
|
|
34
|
+
expect(() => convertKeysFromCamelToUnderscore('some-string')).toThrow(msg);
|
|
35
|
+
});
|
|
36
|
+
|
|
37
|
+
it('should convert camel-cased keys to underscore', () => {
|
|
38
|
+
let value = Math.random();
|
|
39
|
+
expect(convertKeysFromCamelToUnderscore({ LoremIpsum: value })).toEqual({ lorem_ipsum: value });
|
|
40
|
+
value = Math.random();
|
|
41
|
+
expect(convertKeysFromCamelToUnderscore({ loremIpsum: value })).toEqual({ lorem_ipsum: value });
|
|
42
|
+
value = Math.random();
|
|
43
|
+
expect(convertKeysFromCamelToUnderscore({ 'lorem-ipsum': value })).toEqual({ 'lorem-ipsum': value });
|
|
44
|
+
value = Math.random();
|
|
45
|
+
expect(convertKeysFromCamelToUnderscore({ L123: value })).toEqual({ l123: value });
|
|
46
|
+
});
|
|
47
|
+
|
|
48
|
+
it('should handle multi-leveled object', () => {
|
|
49
|
+
const value = Math.random();
|
|
50
|
+
expect(convertKeysFromCamelToUnderscore({ LoremIpsum: { DoloreSit: { Amet: value }, regular: 'reg' } }))
|
|
51
|
+
.toEqual({ lorem_ipsum: { dolore_sit: { amet: value }, regular: 'reg' } });
|
|
52
|
+
|
|
53
|
+
expect(convertKeysFromCamelToUnderscore({ LoremIpsum: { DoloreSit: { Amet: [value] }, regular: ['something'] } }))
|
|
54
|
+
.toEqual({ lorem_ipsum: { dolore_sit: { amet: [value] }, regular: ['something'] } });
|
|
55
|
+
});
|
|
56
|
+
});
|
|
57
|
+
});
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
//
|
|
2
|
+
|
|
3
|
+
const camelToUnderscore = (key ) => {
|
|
4
|
+
if (typeof key !== 'string') {
|
|
5
|
+
throw new Error('Input is not a string');
|
|
6
|
+
}
|
|
7
|
+
return key.charAt(0).toLowerCase() + key.substring(1).replace(/([A-Z])/g, '_$1').toLowerCase();
|
|
8
|
+
};
|
|
9
|
+
|
|
10
|
+
describe('string utils', () => {
|
|
11
|
+
describe('camelToUnderscore', () => {
|
|
12
|
+
it('', () => {
|
|
13
|
+
expect(() => camelToUnderscore(null)).toThrow('Input is not a string');
|
|
14
|
+
expect(() => camelToUnderscore(undefined)).toThrow('Input is not a string');
|
|
15
|
+
expect(() => camelToUnderscore({})).toThrow('Input is not a string');
|
|
16
|
+
expect(() => camelToUnderscore([])).toThrow('Input is not a string');
|
|
17
|
+
});
|
|
18
|
+
|
|
19
|
+
it('should convert camel-cased string to underscore', () => {
|
|
20
|
+
expect(camelToUnderscore('loremIpsum')).toEqual('lorem_ipsum');
|
|
21
|
+
expect(camelToUnderscore('lorem-ipsum')).toEqual('lorem-ipsum');
|
|
22
|
+
expect(camelToUnderscore('')).toEqual('');
|
|
23
|
+
});
|
|
24
|
+
|
|
25
|
+
it('should not prefix string with an underscore', () => {
|
|
26
|
+
expect(camelToUnderscore('LoremIpsum')).toEqual('lorem_ipsum');
|
|
27
|
+
expect(camelToUnderscore('L123')).toEqual('l123');
|
|
28
|
+
});
|
|
29
|
+
});
|
|
30
|
+
});
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
//
|
|
2
|
+
|
|
3
|
+
const camelToUnderscore = (key ) => {
|
|
4
|
+
if (typeof key !== 'string') {
|
|
5
|
+
throw new Error('Input is not a string');
|
|
6
|
+
}
|
|
7
|
+
return key.charAt(0).toLowerCase() + key.substring(1).replace(/([A-Z])/g, '_$1').toLowerCase();
|
|
8
|
+
};
|
|
9
|
+
|
|
10
|
+
//
|
|
11
|
+
|
|
12
|
+
const convertKeysFromCamelToUnderscore = (args ) => {
|
|
13
|
+
if (!args || typeof args !== 'object' || Array.isArray(args)) {
|
|
14
|
+
throw new Error('Input is not an object');
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
return Object.keys(args).reduce((acc, key) => {
|
|
18
|
+
acc[camelToUnderscore(key)] = typeof args[key] === 'object' && !Array.isArray(args[key])
|
|
19
|
+
? convertKeysFromCamelToUnderscore(args[key]) : args[key];
|
|
20
|
+
return acc;
|
|
21
|
+
}, {});
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
export { convertKeysFromCamelToUnderscore };
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
//
|
|
2
|
+
|
|
3
|
+
const camelToUnderscore = (key ) => {
|
|
4
|
+
if (typeof key !== 'string') {
|
|
5
|
+
throw new Error('Input is not a string');
|
|
6
|
+
}
|
|
7
|
+
return key.charAt(0).toLowerCase() + key.substring(1).replace(/([A-Z])/g, '_$1').toLowerCase();
|
|
8
|
+
};
|
|
9
|
+
|
|
10
|
+
export { camelToUnderscore };
|