@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
|
@@ -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
|
//
|
|
@@ -3607,6 +3760,7 @@ const RECORD_STATE_ACTIVE = 'active';
|
|
|
3607
3760
|
|
|
3608
3761
|
|
|
3609
3762
|
|
|
3763
|
+
|
|
3610
3764
|
|
|
3611
3765
|
|
|
3612
3766
|
|
|
@@ -3617,6 +3771,7 @@ const RECORD_STATE_ACTIVE = 'active';
|
|
|
3617
3771
|
|
|
3618
3772
|
|
|
3619
3773
|
|
|
3774
|
+
|
|
3620
3775
|
|
|
3621
3776
|
|
|
3622
3777
|
|
|
@@ -3645,6 +3800,7 @@ class Call {
|
|
|
3645
3800
|
|
|
3646
3801
|
|
|
3647
3802
|
|
|
3803
|
+
|
|
3648
3804
|
|
|
3649
3805
|
|
|
3650
3806
|
|
|
@@ -3669,6 +3825,7 @@ class Call {
|
|
|
3669
3825
|
calleeNumber: plain.peer_caller_id_number,
|
|
3670
3826
|
dialedExtension: plain.dialed_extension,
|
|
3671
3827
|
isCaller: plain.is_caller,
|
|
3828
|
+
isVideo: plain.is_video,
|
|
3672
3829
|
muted: plain.muted,
|
|
3673
3830
|
onHold: plain.on_hold,
|
|
3674
3831
|
status: plain.status,
|
|
@@ -3692,6 +3849,7 @@ class Call {
|
|
|
3692
3849
|
calleeNumber,
|
|
3693
3850
|
dialedExtension,
|
|
3694
3851
|
isCaller,
|
|
3852
|
+
isVideo,
|
|
3695
3853
|
lineId,
|
|
3696
3854
|
muted,
|
|
3697
3855
|
onHold,
|
|
@@ -3715,6 +3873,7 @@ class Call {
|
|
|
3715
3873
|
this.startingTime = startingTime;
|
|
3716
3874
|
this.talkingToIds = talkingToIds || [];
|
|
3717
3875
|
this.recording = recording;
|
|
3876
|
+
this.isVideo = !!isVideo;
|
|
3718
3877
|
|
|
3719
3878
|
// Useful to compare instead of instanceof with minified code
|
|
3720
3879
|
this.type = 'Call';
|
|
@@ -4774,6 +4933,14 @@ var calldMethods = (client , baseUrl ) => ({
|
|
|
4774
4933
|
getMeetingParticipantsAsUser: async (meetingUuid ) =>
|
|
4775
4934
|
client.get(`${baseUrl}/users/me/meetings/${meetingUuid}/participants`),
|
|
4776
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
|
+
|
|
4777
4944
|
listTrunks: () => client.get(`${baseUrl}/trunks`),
|
|
4778
4945
|
|
|
4779
4946
|
mute: (callId ) =>
|
|
@@ -6414,41 +6581,58 @@ class WebRTCClient extends Emitter {
|
|
|
6414
6581
|
});
|
|
6415
6582
|
}
|
|
6416
6583
|
|
|
6417
|
-
changeAudioInputDevice(id , session ) {
|
|
6584
|
+
async changeAudioInputDevice(id , session , force ) {
|
|
6418
6585
|
const currentId = this.getAudioDeviceId();
|
|
6419
6586
|
logger.info('setting audio input device', { id, currentId, session: !!session });
|
|
6420
6587
|
|
|
6421
|
-
if (id === currentId) {
|
|
6588
|
+
if (!force && id === currentId) {
|
|
6422
6589
|
return null;
|
|
6423
6590
|
}
|
|
6424
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
|
+
|
|
6425
6610
|
// let's update the local audio value
|
|
6426
6611
|
if (this.audio) {
|
|
6427
6612
|
this.audio = {
|
|
6428
6613
|
deviceId: {
|
|
6429
|
-
exact:
|
|
6614
|
+
exact: deviceId,
|
|
6430
6615
|
},
|
|
6431
6616
|
};
|
|
6432
6617
|
}
|
|
6433
6618
|
|
|
6434
|
-
if (session) {
|
|
6619
|
+
if (session && navigator.mediaDevices) {
|
|
6435
6620
|
const sdh = session.sessionDescriptionHandler;
|
|
6436
6621
|
const pc = sdh.peerConnection;
|
|
6437
6622
|
|
|
6438
|
-
|
|
6439
|
-
|
|
6440
|
-
|
|
6441
|
-
|
|
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);
|
|
6442
6627
|
|
|
6443
|
-
|
|
6444
|
-
|
|
6445
|
-
|
|
6446
|
-
}
|
|
6447
|
-
sender.replaceTrack(audioTrack);
|
|
6628
|
+
if (sender) {
|
|
6629
|
+
if (sender.track) {
|
|
6630
|
+
audioTrack.enabled = sender.track.enabled;
|
|
6448
6631
|
}
|
|
6632
|
+
sender.replaceTrack(audioTrack);
|
|
6633
|
+
}
|
|
6449
6634
|
|
|
6450
|
-
|
|
6451
|
-
});
|
|
6635
|
+
return stream;
|
|
6452
6636
|
}
|
|
6453
6637
|
}
|
|
6454
6638
|
|
|
@@ -6468,14 +6652,14 @@ class WebRTCClient extends Emitter {
|
|
|
6468
6652
|
return null;
|
|
6469
6653
|
}
|
|
6470
6654
|
|
|
6471
|
-
// let's
|
|
6472
|
-
|
|
6473
|
-
|
|
6474
|
-
|
|
6475
|
-
|
|
6476
|
-
|
|
6477
|
-
}
|
|
6478
|
-
}
|
|
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
|
+
};
|
|
6479
6663
|
}
|
|
6480
6664
|
|
|
6481
6665
|
changeSessionVideoInputDevice(id , session ) {
|
|
@@ -30,6 +30,7 @@ const RECORD_STATE_ACTIVE = 'active';
|
|
|
30
30
|
|
|
31
31
|
|
|
32
32
|
|
|
33
|
+
|
|
33
34
|
|
|
34
35
|
|
|
35
36
|
|
|
@@ -40,6 +41,7 @@ const RECORD_STATE_ACTIVE = 'active';
|
|
|
40
41
|
|
|
41
42
|
|
|
42
43
|
|
|
44
|
+
|
|
43
45
|
|
|
44
46
|
|
|
45
47
|
|
|
@@ -68,6 +70,7 @@ class Call {
|
|
|
68
70
|
|
|
69
71
|
|
|
70
72
|
|
|
73
|
+
|
|
71
74
|
|
|
72
75
|
|
|
73
76
|
|
|
@@ -92,6 +95,7 @@ class Call {
|
|
|
92
95
|
calleeNumber: plain.peer_caller_id_number,
|
|
93
96
|
dialedExtension: plain.dialed_extension,
|
|
94
97
|
isCaller: plain.is_caller,
|
|
98
|
+
isVideo: plain.is_video,
|
|
95
99
|
muted: plain.muted,
|
|
96
100
|
onHold: plain.on_hold,
|
|
97
101
|
status: plain.status,
|
|
@@ -115,6 +119,7 @@ class Call {
|
|
|
115
119
|
calleeNumber,
|
|
116
120
|
dialedExtension,
|
|
117
121
|
isCaller,
|
|
122
|
+
isVideo,
|
|
118
123
|
lineId,
|
|
119
124
|
muted,
|
|
120
125
|
onHold,
|
|
@@ -138,6 +143,7 @@ class Call {
|
|
|
138
143
|
this.startingTime = startingTime;
|
|
139
144
|
this.talkingToIds = talkingToIds || [];
|
|
140
145
|
this.recording = recording;
|
|
146
|
+
this.isVideo = !!isVideo;
|
|
141
147
|
|
|
142
148
|
// Useful to compare instead of instanceof with minified code
|
|
143
149
|
this.type = 'Call';
|
|
@@ -2834,6 +2840,70 @@ class ExternalApp {
|
|
|
2834
2840
|
|
|
2835
2841
|
//
|
|
2836
2842
|
|
|
2843
|
+
class MeetingAuthorization {
|
|
2844
|
+
|
|
2845
|
+
|
|
2846
|
+
|
|
2847
|
+
|
|
2848
|
+
|
|
2849
|
+
|
|
2850
|
+
constructor({
|
|
2851
|
+
meetingUuid,
|
|
2852
|
+
uuid,
|
|
2853
|
+
userUuid,
|
|
2854
|
+
userName,
|
|
2855
|
+
} = {}) {
|
|
2856
|
+
this.meetingUuid = meetingUuid;
|
|
2857
|
+
this.uuid = uuid;
|
|
2858
|
+
this.userUuid = userUuid;
|
|
2859
|
+
this.userName = userName;
|
|
2860
|
+
}
|
|
2861
|
+
|
|
2862
|
+
setStatus(status ) {
|
|
2863
|
+
this.status = status;
|
|
2864
|
+
}
|
|
2865
|
+
|
|
2866
|
+
getStatus() {
|
|
2867
|
+
return this.status;
|
|
2868
|
+
}
|
|
2869
|
+
|
|
2870
|
+
static parse(plain ) {
|
|
2871
|
+
const {
|
|
2872
|
+
meeting_uuid: meetingUuid,
|
|
2873
|
+
uuid,
|
|
2874
|
+
guest_uuid: userUuid,
|
|
2875
|
+
guest_name: userName,
|
|
2876
|
+
} = plain;
|
|
2877
|
+
|
|
2878
|
+
return new MeetingAuthorization({
|
|
2879
|
+
meetingUuid,
|
|
2880
|
+
uuid,
|
|
2881
|
+
userUuid,
|
|
2882
|
+
userName,
|
|
2883
|
+
});
|
|
2884
|
+
}
|
|
2885
|
+
|
|
2886
|
+
static parseMany(items ) {
|
|
2887
|
+
if (!items) {
|
|
2888
|
+
return [];
|
|
2889
|
+
}
|
|
2890
|
+
return items.map(MeetingAuthorization.parse);
|
|
2891
|
+
}
|
|
2892
|
+
}
|
|
2893
|
+
|
|
2894
|
+
//
|
|
2895
|
+
|
|
2896
|
+
|
|
2897
|
+
|
|
2898
|
+
|
|
2899
|
+
|
|
2900
|
+
|
|
2901
|
+
|
|
2902
|
+
|
|
2903
|
+
|
|
2904
|
+
|
|
2905
|
+
|
|
2906
|
+
|
|
2837
2907
|
|
|
2838
2908
|
|
|
2839
2909
|
|
|
@@ -2844,6 +2914,7 @@ class ExternalApp {
|
|
|
2844
2914
|
|
|
2845
2915
|
|
|
2846
2916
|
|
|
2917
|
+
|
|
2847
2918
|
|
|
2848
2919
|
|
|
2849
2920
|
class Meeting {
|
|
@@ -2858,6 +2929,8 @@ class Meeting {
|
|
|
2858
2929
|
|
|
2859
2930
|
|
|
2860
2931
|
|
|
2932
|
+
|
|
2933
|
+
|
|
2861
2934
|
|
|
2862
2935
|
static parse(plain ) {
|
|
2863
2936
|
return new Meeting({
|
|
@@ -2870,6 +2943,7 @@ class Meeting {
|
|
|
2870
2943
|
extension: plain.exten,
|
|
2871
2944
|
persistent: plain.persistent,
|
|
2872
2945
|
creationTime: moment(plain.creation_time).toDate(),
|
|
2946
|
+
requireAuthorization: plain.require_authorization,
|
|
2873
2947
|
});
|
|
2874
2948
|
}
|
|
2875
2949
|
|
|
@@ -2894,6 +2968,7 @@ class Meeting {
|
|
|
2894
2968
|
extension,
|
|
2895
2969
|
persistent,
|
|
2896
2970
|
creationTime,
|
|
2971
|
+
requireAuthorization,
|
|
2897
2972
|
} = {}) {
|
|
2898
2973
|
this.guestSipAuthorization = guestSipAuthorization;
|
|
2899
2974
|
this.uri = uri;
|
|
@@ -2904,6 +2979,7 @@ class Meeting {
|
|
|
2904
2979
|
this.extension = extension;
|
|
2905
2980
|
this.persistent = persistent;
|
|
2906
2981
|
this.creationTime = creationTime;
|
|
2982
|
+
this.requireAuthorization = requireAuthorization;
|
|
2907
2983
|
|
|
2908
2984
|
// Useful to compare instead of instanceof with minified code
|
|
2909
2985
|
this.type = 'Meeting';
|
|
@@ -2914,8 +2990,32 @@ class Meeting {
|
|
|
2914
2990
|
const [username, secret] = atob(this.guestSipAuthorization).split(':');
|
|
2915
2991
|
return { username, secret };
|
|
2916
2992
|
}
|
|
2993
|
+
|
|
2917
2994
|
}
|
|
2918
2995
|
|
|
2996
|
+
//
|
|
2997
|
+
|
|
2998
|
+
const camelToUnderscore = (key ) => {
|
|
2999
|
+
if (typeof key !== 'string') {
|
|
3000
|
+
throw new Error('Input is not a string');
|
|
3001
|
+
}
|
|
3002
|
+
return key.charAt(0).toLowerCase() + key.substring(1).replace(/([A-Z])/g, '_$1').toLowerCase();
|
|
3003
|
+
};
|
|
3004
|
+
|
|
3005
|
+
//
|
|
3006
|
+
|
|
3007
|
+
const convertKeysFromCamelToUnderscore = (args ) => {
|
|
3008
|
+
if (!args || typeof args !== 'object' || Array.isArray(args)) {
|
|
3009
|
+
throw new Error('Input is not an object');
|
|
3010
|
+
}
|
|
3011
|
+
|
|
3012
|
+
return Object.keys(args).reduce((acc, key) => {
|
|
3013
|
+
acc[camelToUnderscore(key)] = typeof args[key] === 'object' && !Array.isArray(args[key])
|
|
3014
|
+
? convertKeysFromCamelToUnderscore(args[key]) : args[key];
|
|
3015
|
+
return acc;
|
|
3016
|
+
}, {});
|
|
3017
|
+
};
|
|
3018
|
+
|
|
2919
3019
|
/* */
|
|
2920
3020
|
|
|
2921
3021
|
var confdMethods = (client , baseUrl ) => ({
|
|
@@ -2984,8 +3084,18 @@ var confdMethods = (client , baseUrl ) => ({
|
|
|
2984
3084
|
getMyMeetings: () =>
|
|
2985
3085
|
client.get(`${baseUrl}/users/me/meetings`).then(response => Meeting.parseMany(response.items)),
|
|
2986
3086
|
|
|
2987
|
-
createMyMeeting: (
|
|
2988
|
-
client
|
|
3087
|
+
createMyMeeting: (args ) =>
|
|
3088
|
+
client
|
|
3089
|
+
.post(`${baseUrl}/users/me/meetings`, convertKeysFromCamelToUnderscore(args))
|
|
3090
|
+
.then(Meeting.parse),
|
|
3091
|
+
|
|
3092
|
+
updateMyMeeting: (meetingUuid , data ) =>
|
|
3093
|
+
client.put(
|
|
3094
|
+
`${baseUrl}/users/me/meetings/${meetingUuid}`,
|
|
3095
|
+
convertKeysFromCamelToUnderscore(data),
|
|
3096
|
+
null,
|
|
3097
|
+
ApiRequester.successResponseParser,
|
|
3098
|
+
),
|
|
2989
3099
|
|
|
2990
3100
|
deleteMyMeeting: (meetingUuid ) =>
|
|
2991
3101
|
client.delete(`${baseUrl}/users/me/meetings/${meetingUuid}`, null),
|
|
@@ -2993,8 +3103,36 @@ var confdMethods = (client , baseUrl ) => ({
|
|
|
2993
3103
|
getMeeting: (meetingUuid ) =>
|
|
2994
3104
|
client.get(`${baseUrl}/meetings/${meetingUuid}`, null).then(Meeting.parse),
|
|
2995
3105
|
|
|
3106
|
+
meetingAuthorizations: (meetingUuid ) =>
|
|
3107
|
+
client.get(`${baseUrl}/users/me/meetings/${meetingUuid}/authorizations`, null).then(MeetingAuthorization.parseMany),
|
|
3108
|
+
|
|
3109
|
+
meetingAuthorizationReject: (meetingUuid , authorizationUuid ) =>
|
|
3110
|
+
client.put(
|
|
3111
|
+
`${baseUrl}/users/me/meetings/${meetingUuid}/authorizations/${authorizationUuid}/reject`,
|
|
3112
|
+
{},
|
|
3113
|
+
null,
|
|
3114
|
+
ApiRequester.successResponseParser,
|
|
3115
|
+
),
|
|
3116
|
+
|
|
3117
|
+
meetingAuthorizationAccept: (meetingUuid , authorizationUuid ) =>
|
|
3118
|
+
client.put(
|
|
3119
|
+
`${baseUrl}/users/me/meetings/${meetingUuid}/authorizations/${authorizationUuid}/accept`,
|
|
3120
|
+
{},
|
|
3121
|
+
null,
|
|
3122
|
+
ApiRequester.successResponseParser,
|
|
3123
|
+
),
|
|
3124
|
+
|
|
2996
3125
|
guestGetMeeting: (meetingUuid ) =>
|
|
2997
3126
|
client.get(`${baseUrl}/guests/me/meetings/${meetingUuid}`, null).then(Meeting.parse),
|
|
3127
|
+
|
|
3128
|
+
guestAuthorizationRequest: (userUuid , meetingUuid , username ) =>
|
|
3129
|
+
client
|
|
3130
|
+
.post(`${baseUrl}/guests/${userUuid}/meetings/${meetingUuid}/authorizations`, { guest_name: username })
|
|
3131
|
+
.then(MeetingAuthorization.parse),
|
|
3132
|
+
|
|
3133
|
+
guestAuthorizationCheck: (userUuid , meetingUuid , authorizationUuid ) =>
|
|
3134
|
+
client.get(`${baseUrl}/guests/${userUuid}/meetings/${meetingUuid}/authorizations/${authorizationUuid}`, null),
|
|
3135
|
+
|
|
2998
3136
|
});
|
|
2999
3137
|
|
|
3000
3138
|
//
|
|
@@ -4201,6 +4339,14 @@ var calldMethods = (client , baseUrl ) => ({
|
|
|
4201
4339
|
getMeetingParticipantsAsUser: async (meetingUuid ) =>
|
|
4202
4340
|
client.get(`${baseUrl}/users/me/meetings/${meetingUuid}/participants`),
|
|
4203
4341
|
|
|
4342
|
+
banMeetingParticipant: (meetingUuid , participantUuid ) =>
|
|
4343
|
+
client.delete(
|
|
4344
|
+
`${baseUrl}/users/me/meetings/${meetingUuid}/participants/${participantUuid}`,
|
|
4345
|
+
null,
|
|
4346
|
+
null,
|
|
4347
|
+
ApiRequester.successResponseParser,
|
|
4348
|
+
),
|
|
4349
|
+
|
|
4204
4350
|
listTrunks: () => client.get(`${baseUrl}/trunks`),
|
|
4205
4351
|
|
|
4206
4352
|
mute: (callId ) =>
|
package/esm/domain/Call.js
CHANGED
|
@@ -25,6 +25,7 @@ const RECORD_STATE_ACTIVE = 'active';
|
|
|
25
25
|
|
|
26
26
|
|
|
27
27
|
|
|
28
|
+
|
|
28
29
|
|
|
29
30
|
|
|
30
31
|
|
|
@@ -35,6 +36,7 @@ const RECORD_STATE_ACTIVE = 'active';
|
|
|
35
36
|
|
|
36
37
|
|
|
37
38
|
|
|
39
|
+
|
|
38
40
|
|
|
39
41
|
|
|
40
42
|
|
|
@@ -63,6 +65,7 @@ class Call {
|
|
|
63
65
|
|
|
64
66
|
|
|
65
67
|
|
|
68
|
+
|
|
66
69
|
|
|
67
70
|
|
|
68
71
|
|
|
@@ -87,6 +90,7 @@ class Call {
|
|
|
87
90
|
calleeNumber: plain.peer_caller_id_number,
|
|
88
91
|
dialedExtension: plain.dialed_extension,
|
|
89
92
|
isCaller: plain.is_caller,
|
|
93
|
+
isVideo: plain.is_video,
|
|
90
94
|
muted: plain.muted,
|
|
91
95
|
onHold: plain.on_hold,
|
|
92
96
|
status: plain.status,
|
|
@@ -110,6 +114,7 @@ class Call {
|
|
|
110
114
|
calleeNumber,
|
|
111
115
|
dialedExtension,
|
|
112
116
|
isCaller,
|
|
117
|
+
isVideo,
|
|
113
118
|
lineId,
|
|
114
119
|
muted,
|
|
115
120
|
onHold,
|
|
@@ -133,6 +138,7 @@ class Call {
|
|
|
133
138
|
this.startingTime = startingTime;
|
|
134
139
|
this.talkingToIds = talkingToIds || [];
|
|
135
140
|
this.recording = recording;
|
|
141
|
+
this.isVideo = !!isVideo;
|
|
136
142
|
|
|
137
143
|
// Useful to compare instead of instanceof with minified code
|
|
138
144
|
this.type = 'Call';
|
|
@@ -414,7 +414,7 @@ class CallSession {
|
|
|
414
414
|
ringing: call.isRinging(),
|
|
415
415
|
answered: call.isUp(),
|
|
416
416
|
answeredBySystem: call.isUp() && call.talkingToIds.length === 0,
|
|
417
|
-
cameraEnabled:
|
|
417
|
+
cameraEnabled: call.isVideo,
|
|
418
418
|
dialedExtension: call.dialedExtension,
|
|
419
419
|
call,
|
|
420
420
|
conference: false, // @FIXME?
|