@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
|
@@ -787,6 +787,24 @@ const fixSdp = (sdp , candidates , forcePort = true)
|
|
|
787
787
|
return fixed;
|
|
788
788
|
};
|
|
789
789
|
|
|
790
|
+
const addIcesInAllBundles = (sdp ) => {
|
|
791
|
+
const parsedSdp = sdpParser__default['default'].parse(sdp);
|
|
792
|
+
|
|
793
|
+
const mediaWithCandidate = parsedSdp.media.find(media => !!media.candidates);
|
|
794
|
+
if (!mediaWithCandidate) {
|
|
795
|
+
return sdp;
|
|
796
|
+
}
|
|
797
|
+
|
|
798
|
+
const { candidates } = mediaWithCandidate;
|
|
799
|
+
|
|
800
|
+
parsedSdp.media = parsedSdp.media.map(media => ({
|
|
801
|
+
...media,
|
|
802
|
+
candidates: media.candidates || candidates,
|
|
803
|
+
}));
|
|
804
|
+
|
|
805
|
+
return sdpParser__default['default'].write(parsedSdp);
|
|
806
|
+
};
|
|
807
|
+
|
|
790
808
|
/* global RTCSessionDescriptionInit, navigator */
|
|
791
809
|
|
|
792
810
|
const wazoLogger = IssueReporter$1 ? IssueReporter$1.loggerFor('webrtc-sdh') : console;
|
|
@@ -916,7 +934,10 @@ class WazoSessionDescriptionHandler extends sessionDescriptionHandler.SessionDes
|
|
|
916
934
|
|
|
917
935
|
// Check if we got ICEs
|
|
918
936
|
if (sdp.indexOf('a=candidate') !== -1) {
|
|
919
|
-
return
|
|
937
|
+
return {
|
|
938
|
+
type: description.type,
|
|
939
|
+
sdp: addIcesInAllBundles(sdp),
|
|
940
|
+
};
|
|
920
941
|
}
|
|
921
942
|
|
|
922
943
|
wazoLogger.info('No ICE candidates found in SDP, fixing it with gathered ices', this.gatheredCandidates);
|
|
@@ -3190,6 +3211,70 @@ class ExternalApp {
|
|
|
3190
3211
|
|
|
3191
3212
|
//
|
|
3192
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
|
+
|
|
3193
3278
|
|
|
3194
3279
|
|
|
3195
3280
|
|
|
@@ -3200,6 +3285,7 @@ class ExternalApp {
|
|
|
3200
3285
|
|
|
3201
3286
|
|
|
3202
3287
|
|
|
3288
|
+
|
|
3203
3289
|
|
|
3204
3290
|
|
|
3205
3291
|
class Meeting {
|
|
@@ -3214,6 +3300,8 @@ class Meeting {
|
|
|
3214
3300
|
|
|
3215
3301
|
|
|
3216
3302
|
|
|
3303
|
+
|
|
3304
|
+
|
|
3217
3305
|
|
|
3218
3306
|
static parse(plain ) {
|
|
3219
3307
|
return new Meeting({
|
|
@@ -3226,6 +3314,7 @@ class Meeting {
|
|
|
3226
3314
|
extension: plain.exten,
|
|
3227
3315
|
persistent: plain.persistent,
|
|
3228
3316
|
creationTime: moment__default['default'](plain.creation_time).toDate(),
|
|
3317
|
+
requireAuthorization: plain.require_authorization,
|
|
3229
3318
|
});
|
|
3230
3319
|
}
|
|
3231
3320
|
|
|
@@ -3250,6 +3339,7 @@ class Meeting {
|
|
|
3250
3339
|
extension,
|
|
3251
3340
|
persistent,
|
|
3252
3341
|
creationTime,
|
|
3342
|
+
requireAuthorization,
|
|
3253
3343
|
} = {}) {
|
|
3254
3344
|
this.guestSipAuthorization = guestSipAuthorization;
|
|
3255
3345
|
this.uri = uri;
|
|
@@ -3260,6 +3350,7 @@ class Meeting {
|
|
|
3260
3350
|
this.extension = extension;
|
|
3261
3351
|
this.persistent = persistent;
|
|
3262
3352
|
this.creationTime = creationTime;
|
|
3353
|
+
this.requireAuthorization = requireAuthorization;
|
|
3263
3354
|
|
|
3264
3355
|
// Useful to compare instead of instanceof with minified code
|
|
3265
3356
|
this.type = 'Meeting';
|
|
@@ -3270,8 +3361,32 @@ class Meeting {
|
|
|
3270
3361
|
const [username, secret] = atob(this.guestSipAuthorization).split(':');
|
|
3271
3362
|
return { username, secret };
|
|
3272
3363
|
}
|
|
3364
|
+
|
|
3273
3365
|
}
|
|
3274
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
|
+
|
|
3275
3390
|
/* */
|
|
3276
3391
|
|
|
3277
3392
|
var confdMethods = (client , baseUrl ) => ({
|
|
@@ -3340,8 +3455,18 @@ var confdMethods = (client , baseUrl ) => ({
|
|
|
3340
3455
|
getMyMeetings: () =>
|
|
3341
3456
|
client.get(`${baseUrl}/users/me/meetings`).then(response => Meeting.parseMany(response.items)),
|
|
3342
3457
|
|
|
3343
|
-
createMyMeeting: (
|
|
3344
|
-
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
|
+
),
|
|
3345
3470
|
|
|
3346
3471
|
deleteMyMeeting: (meetingUuid ) =>
|
|
3347
3472
|
client.delete(`${baseUrl}/users/me/meetings/${meetingUuid}`, null),
|
|
@@ -3349,8 +3474,36 @@ var confdMethods = (client , baseUrl ) => ({
|
|
|
3349
3474
|
getMeeting: (meetingUuid ) =>
|
|
3350
3475
|
client.get(`${baseUrl}/meetings/${meetingUuid}`, null).then(Meeting.parse),
|
|
3351
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
|
+
|
|
3352
3496
|
guestGetMeeting: (meetingUuid ) =>
|
|
3353
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
|
+
|
|
3354
3507
|
});
|
|
3355
3508
|
|
|
3356
3509
|
//
|
|
@@ -3616,6 +3769,7 @@ const RECORD_STATE_ACTIVE = 'active';
|
|
|
3616
3769
|
|
|
3617
3770
|
|
|
3618
3771
|
|
|
3772
|
+
|
|
3619
3773
|
|
|
3620
3774
|
|
|
3621
3775
|
|
|
@@ -3626,6 +3780,7 @@ const RECORD_STATE_ACTIVE = 'active';
|
|
|
3626
3780
|
|
|
3627
3781
|
|
|
3628
3782
|
|
|
3783
|
+
|
|
3629
3784
|
|
|
3630
3785
|
|
|
3631
3786
|
|
|
@@ -3654,6 +3809,7 @@ class Call {
|
|
|
3654
3809
|
|
|
3655
3810
|
|
|
3656
3811
|
|
|
3812
|
+
|
|
3657
3813
|
|
|
3658
3814
|
|
|
3659
3815
|
|
|
@@ -3678,6 +3834,7 @@ class Call {
|
|
|
3678
3834
|
calleeNumber: plain.peer_caller_id_number,
|
|
3679
3835
|
dialedExtension: plain.dialed_extension,
|
|
3680
3836
|
isCaller: plain.is_caller,
|
|
3837
|
+
isVideo: plain.is_video,
|
|
3681
3838
|
muted: plain.muted,
|
|
3682
3839
|
onHold: plain.on_hold,
|
|
3683
3840
|
status: plain.status,
|
|
@@ -3701,6 +3858,7 @@ class Call {
|
|
|
3701
3858
|
calleeNumber,
|
|
3702
3859
|
dialedExtension,
|
|
3703
3860
|
isCaller,
|
|
3861
|
+
isVideo,
|
|
3704
3862
|
lineId,
|
|
3705
3863
|
muted,
|
|
3706
3864
|
onHold,
|
|
@@ -3724,6 +3882,7 @@ class Call {
|
|
|
3724
3882
|
this.startingTime = startingTime;
|
|
3725
3883
|
this.talkingToIds = talkingToIds || [];
|
|
3726
3884
|
this.recording = recording;
|
|
3885
|
+
this.isVideo = !!isVideo;
|
|
3727
3886
|
|
|
3728
3887
|
// Useful to compare instead of instanceof with minified code
|
|
3729
3888
|
this.type = 'Call';
|
|
@@ -4783,6 +4942,14 @@ var calldMethods = (client , baseUrl ) => ({
|
|
|
4783
4942
|
getMeetingParticipantsAsUser: async (meetingUuid ) =>
|
|
4784
4943
|
client.get(`${baseUrl}/users/me/meetings/${meetingUuid}/participants`),
|
|
4785
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
|
+
|
|
4786
4953
|
listTrunks: () => client.get(`${baseUrl}/trunks`),
|
|
4787
4954
|
|
|
4788
4955
|
mute: (callId ) =>
|
|
@@ -6423,41 +6590,58 @@ class WebRTCClient extends Emitter {
|
|
|
6423
6590
|
});
|
|
6424
6591
|
}
|
|
6425
6592
|
|
|
6426
|
-
changeAudioInputDevice(id , session ) {
|
|
6593
|
+
async changeAudioInputDevice(id , session , force ) {
|
|
6427
6594
|
const currentId = this.getAudioDeviceId();
|
|
6428
6595
|
logger.info('setting audio input device', { id, currentId, session: !!session });
|
|
6429
6596
|
|
|
6430
|
-
if (id === currentId) {
|
|
6597
|
+
if (!force && id === currentId) {
|
|
6431
6598
|
return null;
|
|
6432
6599
|
}
|
|
6433
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
|
+
|
|
6434
6619
|
// let's update the local audio value
|
|
6435
6620
|
if (this.audio) {
|
|
6436
6621
|
this.audio = {
|
|
6437
6622
|
deviceId: {
|
|
6438
|
-
exact:
|
|
6623
|
+
exact: deviceId,
|
|
6439
6624
|
},
|
|
6440
6625
|
};
|
|
6441
6626
|
}
|
|
6442
6627
|
|
|
6443
|
-
if (session) {
|
|
6628
|
+
if (session && navigator.mediaDevices) {
|
|
6444
6629
|
const sdh = session.sessionDescriptionHandler;
|
|
6445
6630
|
const pc = sdh.peerConnection;
|
|
6446
6631
|
|
|
6447
|
-
|
|
6448
|
-
|
|
6449
|
-
|
|
6450
|
-
|
|
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);
|
|
6451
6636
|
|
|
6452
|
-
|
|
6453
|
-
|
|
6454
|
-
|
|
6455
|
-
}
|
|
6456
|
-
sender.replaceTrack(audioTrack);
|
|
6637
|
+
if (sender) {
|
|
6638
|
+
if (sender.track) {
|
|
6639
|
+
audioTrack.enabled = sender.track.enabled;
|
|
6457
6640
|
}
|
|
6641
|
+
sender.replaceTrack(audioTrack);
|
|
6642
|
+
}
|
|
6458
6643
|
|
|
6459
|
-
|
|
6460
|
-
});
|
|
6644
|
+
return stream;
|
|
6461
6645
|
}
|
|
6462
6646
|
}
|
|
6463
6647
|
|
|
@@ -6477,14 +6661,14 @@ class WebRTCClient extends Emitter {
|
|
|
6477
6661
|
return null;
|
|
6478
6662
|
}
|
|
6479
6663
|
|
|
6480
|
-
// let's
|
|
6481
|
-
|
|
6482
|
-
|
|
6483
|
-
|
|
6484
|
-
|
|
6485
|
-
|
|
6486
|
-
}
|
|
6487
|
-
}
|
|
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
|
+
};
|
|
6488
6672
|
}
|
|
6489
6673
|
|
|
6490
6674
|
changeSessionVideoInputDevice(id , session ) {
|
|
@@ -36,6 +36,7 @@ const RECORD_STATE_ACTIVE = 'active';
|
|
|
36
36
|
|
|
37
37
|
|
|
38
38
|
|
|
39
|
+
|
|
39
40
|
|
|
40
41
|
|
|
41
42
|
|
|
@@ -46,6 +47,7 @@ const RECORD_STATE_ACTIVE = 'active';
|
|
|
46
47
|
|
|
47
48
|
|
|
48
49
|
|
|
50
|
+
|
|
49
51
|
|
|
50
52
|
|
|
51
53
|
|
|
@@ -74,6 +76,7 @@ class Call {
|
|
|
74
76
|
|
|
75
77
|
|
|
76
78
|
|
|
79
|
+
|
|
77
80
|
|
|
78
81
|
|
|
79
82
|
|
|
@@ -98,6 +101,7 @@ class Call {
|
|
|
98
101
|
calleeNumber: plain.peer_caller_id_number,
|
|
99
102
|
dialedExtension: plain.dialed_extension,
|
|
100
103
|
isCaller: plain.is_caller,
|
|
104
|
+
isVideo: plain.is_video,
|
|
101
105
|
muted: plain.muted,
|
|
102
106
|
onHold: plain.on_hold,
|
|
103
107
|
status: plain.status,
|
|
@@ -121,6 +125,7 @@ class Call {
|
|
|
121
125
|
calleeNumber,
|
|
122
126
|
dialedExtension,
|
|
123
127
|
isCaller,
|
|
128
|
+
isVideo,
|
|
124
129
|
lineId,
|
|
125
130
|
muted,
|
|
126
131
|
onHold,
|
|
@@ -144,6 +149,7 @@ class Call {
|
|
|
144
149
|
this.startingTime = startingTime;
|
|
145
150
|
this.talkingToIds = talkingToIds || [];
|
|
146
151
|
this.recording = recording;
|
|
152
|
+
this.isVideo = !!isVideo;
|
|
147
153
|
|
|
148
154
|
// Useful to compare instead of instanceof with minified code
|
|
149
155
|
this.type = 'Call';
|
|
@@ -2840,6 +2846,70 @@ class ExternalApp {
|
|
|
2840
2846
|
|
|
2841
2847
|
//
|
|
2842
2848
|
|
|
2849
|
+
class MeetingAuthorization {
|
|
2850
|
+
|
|
2851
|
+
|
|
2852
|
+
|
|
2853
|
+
|
|
2854
|
+
|
|
2855
|
+
|
|
2856
|
+
constructor({
|
|
2857
|
+
meetingUuid,
|
|
2858
|
+
uuid,
|
|
2859
|
+
userUuid,
|
|
2860
|
+
userName,
|
|
2861
|
+
} = {}) {
|
|
2862
|
+
this.meetingUuid = meetingUuid;
|
|
2863
|
+
this.uuid = uuid;
|
|
2864
|
+
this.userUuid = userUuid;
|
|
2865
|
+
this.userName = userName;
|
|
2866
|
+
}
|
|
2867
|
+
|
|
2868
|
+
setStatus(status ) {
|
|
2869
|
+
this.status = status;
|
|
2870
|
+
}
|
|
2871
|
+
|
|
2872
|
+
getStatus() {
|
|
2873
|
+
return this.status;
|
|
2874
|
+
}
|
|
2875
|
+
|
|
2876
|
+
static parse(plain ) {
|
|
2877
|
+
const {
|
|
2878
|
+
meeting_uuid: meetingUuid,
|
|
2879
|
+
uuid,
|
|
2880
|
+
guest_uuid: userUuid,
|
|
2881
|
+
guest_name: userName,
|
|
2882
|
+
} = plain;
|
|
2883
|
+
|
|
2884
|
+
return new MeetingAuthorization({
|
|
2885
|
+
meetingUuid,
|
|
2886
|
+
uuid,
|
|
2887
|
+
userUuid,
|
|
2888
|
+
userName,
|
|
2889
|
+
});
|
|
2890
|
+
}
|
|
2891
|
+
|
|
2892
|
+
static parseMany(items ) {
|
|
2893
|
+
if (!items) {
|
|
2894
|
+
return [];
|
|
2895
|
+
}
|
|
2896
|
+
return items.map(MeetingAuthorization.parse);
|
|
2897
|
+
}
|
|
2898
|
+
}
|
|
2899
|
+
|
|
2900
|
+
//
|
|
2901
|
+
|
|
2902
|
+
|
|
2903
|
+
|
|
2904
|
+
|
|
2905
|
+
|
|
2906
|
+
|
|
2907
|
+
|
|
2908
|
+
|
|
2909
|
+
|
|
2910
|
+
|
|
2911
|
+
|
|
2912
|
+
|
|
2843
2913
|
|
|
2844
2914
|
|
|
2845
2915
|
|
|
@@ -2850,6 +2920,7 @@ class ExternalApp {
|
|
|
2850
2920
|
|
|
2851
2921
|
|
|
2852
2922
|
|
|
2923
|
+
|
|
2853
2924
|
|
|
2854
2925
|
|
|
2855
2926
|
class Meeting {
|
|
@@ -2864,6 +2935,8 @@ class Meeting {
|
|
|
2864
2935
|
|
|
2865
2936
|
|
|
2866
2937
|
|
|
2938
|
+
|
|
2939
|
+
|
|
2867
2940
|
|
|
2868
2941
|
static parse(plain ) {
|
|
2869
2942
|
return new Meeting({
|
|
@@ -2876,6 +2949,7 @@ class Meeting {
|
|
|
2876
2949
|
extension: plain.exten,
|
|
2877
2950
|
persistent: plain.persistent,
|
|
2878
2951
|
creationTime: moment__default['default'](plain.creation_time).toDate(),
|
|
2952
|
+
requireAuthorization: plain.require_authorization,
|
|
2879
2953
|
});
|
|
2880
2954
|
}
|
|
2881
2955
|
|
|
@@ -2900,6 +2974,7 @@ class Meeting {
|
|
|
2900
2974
|
extension,
|
|
2901
2975
|
persistent,
|
|
2902
2976
|
creationTime,
|
|
2977
|
+
requireAuthorization,
|
|
2903
2978
|
} = {}) {
|
|
2904
2979
|
this.guestSipAuthorization = guestSipAuthorization;
|
|
2905
2980
|
this.uri = uri;
|
|
@@ -2910,6 +2985,7 @@ class Meeting {
|
|
|
2910
2985
|
this.extension = extension;
|
|
2911
2986
|
this.persistent = persistent;
|
|
2912
2987
|
this.creationTime = creationTime;
|
|
2988
|
+
this.requireAuthorization = requireAuthorization;
|
|
2913
2989
|
|
|
2914
2990
|
// Useful to compare instead of instanceof with minified code
|
|
2915
2991
|
this.type = 'Meeting';
|
|
@@ -2920,8 +2996,32 @@ class Meeting {
|
|
|
2920
2996
|
const [username, secret] = atob(this.guestSipAuthorization).split(':');
|
|
2921
2997
|
return { username, secret };
|
|
2922
2998
|
}
|
|
2999
|
+
|
|
2923
3000
|
}
|
|
2924
3001
|
|
|
3002
|
+
//
|
|
3003
|
+
|
|
3004
|
+
const camelToUnderscore = (key ) => {
|
|
3005
|
+
if (typeof key !== 'string') {
|
|
3006
|
+
throw new Error('Input is not a string');
|
|
3007
|
+
}
|
|
3008
|
+
return key.charAt(0).toLowerCase() + key.substring(1).replace(/([A-Z])/g, '_$1').toLowerCase();
|
|
3009
|
+
};
|
|
3010
|
+
|
|
3011
|
+
//
|
|
3012
|
+
|
|
3013
|
+
const convertKeysFromCamelToUnderscore = (args ) => {
|
|
3014
|
+
if (!args || typeof args !== 'object' || Array.isArray(args)) {
|
|
3015
|
+
throw new Error('Input is not an object');
|
|
3016
|
+
}
|
|
3017
|
+
|
|
3018
|
+
return Object.keys(args).reduce((acc, key) => {
|
|
3019
|
+
acc[camelToUnderscore(key)] = typeof args[key] === 'object' && !Array.isArray(args[key])
|
|
3020
|
+
? convertKeysFromCamelToUnderscore(args[key]) : args[key];
|
|
3021
|
+
return acc;
|
|
3022
|
+
}, {});
|
|
3023
|
+
};
|
|
3024
|
+
|
|
2925
3025
|
/* */
|
|
2926
3026
|
|
|
2927
3027
|
var confdMethods = (client , baseUrl ) => ({
|
|
@@ -2990,8 +3090,18 @@ var confdMethods = (client , baseUrl ) => ({
|
|
|
2990
3090
|
getMyMeetings: () =>
|
|
2991
3091
|
client.get(`${baseUrl}/users/me/meetings`).then(response => Meeting.parseMany(response.items)),
|
|
2992
3092
|
|
|
2993
|
-
createMyMeeting: (
|
|
2994
|
-
client
|
|
3093
|
+
createMyMeeting: (args ) =>
|
|
3094
|
+
client
|
|
3095
|
+
.post(`${baseUrl}/users/me/meetings`, convertKeysFromCamelToUnderscore(args))
|
|
3096
|
+
.then(Meeting.parse),
|
|
3097
|
+
|
|
3098
|
+
updateMyMeeting: (meetingUuid , data ) =>
|
|
3099
|
+
client.put(
|
|
3100
|
+
`${baseUrl}/users/me/meetings/${meetingUuid}`,
|
|
3101
|
+
convertKeysFromCamelToUnderscore(data),
|
|
3102
|
+
null,
|
|
3103
|
+
ApiRequester.successResponseParser,
|
|
3104
|
+
),
|
|
2995
3105
|
|
|
2996
3106
|
deleteMyMeeting: (meetingUuid ) =>
|
|
2997
3107
|
client.delete(`${baseUrl}/users/me/meetings/${meetingUuid}`, null),
|
|
@@ -2999,8 +3109,36 @@ var confdMethods = (client , baseUrl ) => ({
|
|
|
2999
3109
|
getMeeting: (meetingUuid ) =>
|
|
3000
3110
|
client.get(`${baseUrl}/meetings/${meetingUuid}`, null).then(Meeting.parse),
|
|
3001
3111
|
|
|
3112
|
+
meetingAuthorizations: (meetingUuid ) =>
|
|
3113
|
+
client.get(`${baseUrl}/users/me/meetings/${meetingUuid}/authorizations`, null).then(MeetingAuthorization.parseMany),
|
|
3114
|
+
|
|
3115
|
+
meetingAuthorizationReject: (meetingUuid , authorizationUuid ) =>
|
|
3116
|
+
client.put(
|
|
3117
|
+
`${baseUrl}/users/me/meetings/${meetingUuid}/authorizations/${authorizationUuid}/reject`,
|
|
3118
|
+
{},
|
|
3119
|
+
null,
|
|
3120
|
+
ApiRequester.successResponseParser,
|
|
3121
|
+
),
|
|
3122
|
+
|
|
3123
|
+
meetingAuthorizationAccept: (meetingUuid , authorizationUuid ) =>
|
|
3124
|
+
client.put(
|
|
3125
|
+
`${baseUrl}/users/me/meetings/${meetingUuid}/authorizations/${authorizationUuid}/accept`,
|
|
3126
|
+
{},
|
|
3127
|
+
null,
|
|
3128
|
+
ApiRequester.successResponseParser,
|
|
3129
|
+
),
|
|
3130
|
+
|
|
3002
3131
|
guestGetMeeting: (meetingUuid ) =>
|
|
3003
3132
|
client.get(`${baseUrl}/guests/me/meetings/${meetingUuid}`, null).then(Meeting.parse),
|
|
3133
|
+
|
|
3134
|
+
guestAuthorizationRequest: (userUuid , meetingUuid , username ) =>
|
|
3135
|
+
client
|
|
3136
|
+
.post(`${baseUrl}/guests/${userUuid}/meetings/${meetingUuid}/authorizations`, { guest_name: username })
|
|
3137
|
+
.then(MeetingAuthorization.parse),
|
|
3138
|
+
|
|
3139
|
+
guestAuthorizationCheck: (userUuid , meetingUuid , authorizationUuid ) =>
|
|
3140
|
+
client.get(`${baseUrl}/guests/${userUuid}/meetings/${meetingUuid}/authorizations/${authorizationUuid}`, null),
|
|
3141
|
+
|
|
3004
3142
|
});
|
|
3005
3143
|
|
|
3006
3144
|
//
|
|
@@ -4207,6 +4345,14 @@ var calldMethods = (client , baseUrl ) => ({
|
|
|
4207
4345
|
getMeetingParticipantsAsUser: async (meetingUuid ) =>
|
|
4208
4346
|
client.get(`${baseUrl}/users/me/meetings/${meetingUuid}/participants`),
|
|
4209
4347
|
|
|
4348
|
+
banMeetingParticipant: (meetingUuid , participantUuid ) =>
|
|
4349
|
+
client.delete(
|
|
4350
|
+
`${baseUrl}/users/me/meetings/${meetingUuid}/participants/${participantUuid}`,
|
|
4351
|
+
null,
|
|
4352
|
+
null,
|
|
4353
|
+
ApiRequester.successResponseParser,
|
|
4354
|
+
),
|
|
4355
|
+
|
|
4210
4356
|
listTrunks: () => client.get(`${baseUrl}/trunks`),
|
|
4211
4357
|
|
|
4212
4358
|
mute: (callId ) =>
|
package/lib/domain/Call.js
CHANGED
|
@@ -31,6 +31,7 @@ const RECORD_STATE_ACTIVE = 'active';
|
|
|
31
31
|
|
|
32
32
|
|
|
33
33
|
|
|
34
|
+
|
|
34
35
|
|
|
35
36
|
|
|
36
37
|
|
|
@@ -41,6 +42,7 @@ const RECORD_STATE_ACTIVE = 'active';
|
|
|
41
42
|
|
|
42
43
|
|
|
43
44
|
|
|
45
|
+
|
|
44
46
|
|
|
45
47
|
|
|
46
48
|
|
|
@@ -69,6 +71,7 @@ class Call {
|
|
|
69
71
|
|
|
70
72
|
|
|
71
73
|
|
|
74
|
+
|
|
72
75
|
|
|
73
76
|
|
|
74
77
|
|
|
@@ -93,6 +96,7 @@ class Call {
|
|
|
93
96
|
calleeNumber: plain.peer_caller_id_number,
|
|
94
97
|
dialedExtension: plain.dialed_extension,
|
|
95
98
|
isCaller: plain.is_caller,
|
|
99
|
+
isVideo: plain.is_video,
|
|
96
100
|
muted: plain.muted,
|
|
97
101
|
onHold: plain.on_hold,
|
|
98
102
|
status: plain.status,
|
|
@@ -116,6 +120,7 @@ class Call {
|
|
|
116
120
|
calleeNumber,
|
|
117
121
|
dialedExtension,
|
|
118
122
|
isCaller,
|
|
123
|
+
isVideo,
|
|
119
124
|
lineId,
|
|
120
125
|
muted,
|
|
121
126
|
onHold,
|
|
@@ -139,6 +144,7 @@ class Call {
|
|
|
139
144
|
this.startingTime = startingTime;
|
|
140
145
|
this.talkingToIds = talkingToIds || [];
|
|
141
146
|
this.recording = recording;
|
|
147
|
+
this.isVideo = !!isVideo;
|
|
142
148
|
|
|
143
149
|
// Useful to compare instead of instanceof with minified code
|
|
144
150
|
this.type = 'Call';
|
|
@@ -416,7 +416,7 @@ class CallSession {
|
|
|
416
416
|
ringing: call.isRinging(),
|
|
417
417
|
answered: call.isUp(),
|
|
418
418
|
answeredBySystem: call.isUp() && call.talkingToIds.length === 0,
|
|
419
|
-
cameraEnabled:
|
|
419
|
+
cameraEnabled: call.isVideo,
|
|
420
420
|
dialedExtension: call.dialedExtension,
|
|
421
421
|
call,
|
|
422
422
|
conference: false, // @FIXME?
|