@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
package/lib/simple/Phone.js
CHANGED
|
@@ -59,6 +59,7 @@ const RECORD_STATE_ACTIVE = 'active';
|
|
|
59
59
|
|
|
60
60
|
|
|
61
61
|
|
|
62
|
+
|
|
62
63
|
|
|
63
64
|
|
|
64
65
|
|
|
@@ -69,6 +70,7 @@ const RECORD_STATE_ACTIVE = 'active';
|
|
|
69
70
|
|
|
70
71
|
|
|
71
72
|
|
|
73
|
+
|
|
72
74
|
|
|
73
75
|
|
|
74
76
|
|
|
@@ -97,6 +99,7 @@ class Call {
|
|
|
97
99
|
|
|
98
100
|
|
|
99
101
|
|
|
102
|
+
|
|
100
103
|
|
|
101
104
|
|
|
102
105
|
|
|
@@ -121,6 +124,7 @@ class Call {
|
|
|
121
124
|
calleeNumber: plain.peer_caller_id_number,
|
|
122
125
|
dialedExtension: plain.dialed_extension,
|
|
123
126
|
isCaller: plain.is_caller,
|
|
127
|
+
isVideo: plain.is_video,
|
|
124
128
|
muted: plain.muted,
|
|
125
129
|
onHold: plain.on_hold,
|
|
126
130
|
status: plain.status,
|
|
@@ -144,6 +148,7 @@ class Call {
|
|
|
144
148
|
calleeNumber,
|
|
145
149
|
dialedExtension,
|
|
146
150
|
isCaller,
|
|
151
|
+
isVideo,
|
|
147
152
|
lineId,
|
|
148
153
|
muted,
|
|
149
154
|
onHold,
|
|
@@ -167,6 +172,7 @@ class Call {
|
|
|
167
172
|
this.startingTime = startingTime;
|
|
168
173
|
this.talkingToIds = talkingToIds || [];
|
|
169
174
|
this.recording = recording;
|
|
175
|
+
this.isVideo = !!isVideo;
|
|
170
176
|
|
|
171
177
|
// Useful to compare instead of instanceof with minified code
|
|
172
178
|
this.type = 'Call';
|
|
@@ -640,7 +646,7 @@ class CallSession {
|
|
|
640
646
|
ringing: call.isRinging(),
|
|
641
647
|
answered: call.isUp(),
|
|
642
648
|
answeredBySystem: call.isUp() && call.talkingToIds.length === 0,
|
|
643
|
-
cameraEnabled:
|
|
649
|
+
cameraEnabled: call.isVideo,
|
|
644
650
|
dialedExtension: call.dialedExtension,
|
|
645
651
|
call,
|
|
646
652
|
conference: false, // @FIXME?
|
|
@@ -3258,6 +3264,70 @@ class ExternalApp {
|
|
|
3258
3264
|
|
|
3259
3265
|
//
|
|
3260
3266
|
|
|
3267
|
+
class MeetingAuthorization {
|
|
3268
|
+
|
|
3269
|
+
|
|
3270
|
+
|
|
3271
|
+
|
|
3272
|
+
|
|
3273
|
+
|
|
3274
|
+
constructor({
|
|
3275
|
+
meetingUuid,
|
|
3276
|
+
uuid,
|
|
3277
|
+
userUuid,
|
|
3278
|
+
userName,
|
|
3279
|
+
} = {}) {
|
|
3280
|
+
this.meetingUuid = meetingUuid;
|
|
3281
|
+
this.uuid = uuid;
|
|
3282
|
+
this.userUuid = userUuid;
|
|
3283
|
+
this.userName = userName;
|
|
3284
|
+
}
|
|
3285
|
+
|
|
3286
|
+
setStatus(status ) {
|
|
3287
|
+
this.status = status;
|
|
3288
|
+
}
|
|
3289
|
+
|
|
3290
|
+
getStatus() {
|
|
3291
|
+
return this.status;
|
|
3292
|
+
}
|
|
3293
|
+
|
|
3294
|
+
static parse(plain ) {
|
|
3295
|
+
const {
|
|
3296
|
+
meeting_uuid: meetingUuid,
|
|
3297
|
+
uuid,
|
|
3298
|
+
guest_uuid: userUuid,
|
|
3299
|
+
guest_name: userName,
|
|
3300
|
+
} = plain;
|
|
3301
|
+
|
|
3302
|
+
return new MeetingAuthorization({
|
|
3303
|
+
meetingUuid,
|
|
3304
|
+
uuid,
|
|
3305
|
+
userUuid,
|
|
3306
|
+
userName,
|
|
3307
|
+
});
|
|
3308
|
+
}
|
|
3309
|
+
|
|
3310
|
+
static parseMany(items ) {
|
|
3311
|
+
if (!items) {
|
|
3312
|
+
return [];
|
|
3313
|
+
}
|
|
3314
|
+
return items.map(MeetingAuthorization.parse);
|
|
3315
|
+
}
|
|
3316
|
+
}
|
|
3317
|
+
|
|
3318
|
+
//
|
|
3319
|
+
|
|
3320
|
+
|
|
3321
|
+
|
|
3322
|
+
|
|
3323
|
+
|
|
3324
|
+
|
|
3325
|
+
|
|
3326
|
+
|
|
3327
|
+
|
|
3328
|
+
|
|
3329
|
+
|
|
3330
|
+
|
|
3261
3331
|
|
|
3262
3332
|
|
|
3263
3333
|
|
|
@@ -3268,6 +3338,7 @@ class ExternalApp {
|
|
|
3268
3338
|
|
|
3269
3339
|
|
|
3270
3340
|
|
|
3341
|
+
|
|
3271
3342
|
|
|
3272
3343
|
|
|
3273
3344
|
class Meeting {
|
|
@@ -3282,6 +3353,8 @@ class Meeting {
|
|
|
3282
3353
|
|
|
3283
3354
|
|
|
3284
3355
|
|
|
3356
|
+
|
|
3357
|
+
|
|
3285
3358
|
|
|
3286
3359
|
static parse(plain ) {
|
|
3287
3360
|
return new Meeting({
|
|
@@ -3294,6 +3367,7 @@ class Meeting {
|
|
|
3294
3367
|
extension: plain.exten,
|
|
3295
3368
|
persistent: plain.persistent,
|
|
3296
3369
|
creationTime: moment__default['default'](plain.creation_time).toDate(),
|
|
3370
|
+
requireAuthorization: plain.require_authorization,
|
|
3297
3371
|
});
|
|
3298
3372
|
}
|
|
3299
3373
|
|
|
@@ -3318,6 +3392,7 @@ class Meeting {
|
|
|
3318
3392
|
extension,
|
|
3319
3393
|
persistent,
|
|
3320
3394
|
creationTime,
|
|
3395
|
+
requireAuthorization,
|
|
3321
3396
|
} = {}) {
|
|
3322
3397
|
this.guestSipAuthorization = guestSipAuthorization;
|
|
3323
3398
|
this.uri = uri;
|
|
@@ -3328,6 +3403,7 @@ class Meeting {
|
|
|
3328
3403
|
this.extension = extension;
|
|
3329
3404
|
this.persistent = persistent;
|
|
3330
3405
|
this.creationTime = creationTime;
|
|
3406
|
+
this.requireAuthorization = requireAuthorization;
|
|
3331
3407
|
|
|
3332
3408
|
// Useful to compare instead of instanceof with minified code
|
|
3333
3409
|
this.type = 'Meeting';
|
|
@@ -3338,8 +3414,32 @@ class Meeting {
|
|
|
3338
3414
|
const [username, secret] = atob(this.guestSipAuthorization).split(':');
|
|
3339
3415
|
return { username, secret };
|
|
3340
3416
|
}
|
|
3417
|
+
|
|
3341
3418
|
}
|
|
3342
3419
|
|
|
3420
|
+
//
|
|
3421
|
+
|
|
3422
|
+
const camelToUnderscore = (key ) => {
|
|
3423
|
+
if (typeof key !== 'string') {
|
|
3424
|
+
throw new Error('Input is not a string');
|
|
3425
|
+
}
|
|
3426
|
+
return key.charAt(0).toLowerCase() + key.substring(1).replace(/([A-Z])/g, '_$1').toLowerCase();
|
|
3427
|
+
};
|
|
3428
|
+
|
|
3429
|
+
//
|
|
3430
|
+
|
|
3431
|
+
const convertKeysFromCamelToUnderscore = (args ) => {
|
|
3432
|
+
if (!args || typeof args !== 'object' || Array.isArray(args)) {
|
|
3433
|
+
throw new Error('Input is not an object');
|
|
3434
|
+
}
|
|
3435
|
+
|
|
3436
|
+
return Object.keys(args).reduce((acc, key) => {
|
|
3437
|
+
acc[camelToUnderscore(key)] = typeof args[key] === 'object' && !Array.isArray(args[key])
|
|
3438
|
+
? convertKeysFromCamelToUnderscore(args[key]) : args[key];
|
|
3439
|
+
return acc;
|
|
3440
|
+
}, {});
|
|
3441
|
+
};
|
|
3442
|
+
|
|
3343
3443
|
/* */
|
|
3344
3444
|
|
|
3345
3445
|
var confdMethods = (client , baseUrl ) => ({
|
|
@@ -3408,8 +3508,18 @@ var confdMethods = (client , baseUrl ) => ({
|
|
|
3408
3508
|
getMyMeetings: () =>
|
|
3409
3509
|
client.get(`${baseUrl}/users/me/meetings`).then(response => Meeting.parseMany(response.items)),
|
|
3410
3510
|
|
|
3411
|
-
createMyMeeting: (
|
|
3412
|
-
client
|
|
3511
|
+
createMyMeeting: (args ) =>
|
|
3512
|
+
client
|
|
3513
|
+
.post(`${baseUrl}/users/me/meetings`, convertKeysFromCamelToUnderscore(args))
|
|
3514
|
+
.then(Meeting.parse),
|
|
3515
|
+
|
|
3516
|
+
updateMyMeeting: (meetingUuid , data ) =>
|
|
3517
|
+
client.put(
|
|
3518
|
+
`${baseUrl}/users/me/meetings/${meetingUuid}`,
|
|
3519
|
+
convertKeysFromCamelToUnderscore(data),
|
|
3520
|
+
null,
|
|
3521
|
+
ApiRequester.successResponseParser,
|
|
3522
|
+
),
|
|
3413
3523
|
|
|
3414
3524
|
deleteMyMeeting: (meetingUuid ) =>
|
|
3415
3525
|
client.delete(`${baseUrl}/users/me/meetings/${meetingUuid}`, null),
|
|
@@ -3417,8 +3527,36 @@ var confdMethods = (client , baseUrl ) => ({
|
|
|
3417
3527
|
getMeeting: (meetingUuid ) =>
|
|
3418
3528
|
client.get(`${baseUrl}/meetings/${meetingUuid}`, null).then(Meeting.parse),
|
|
3419
3529
|
|
|
3530
|
+
meetingAuthorizations: (meetingUuid ) =>
|
|
3531
|
+
client.get(`${baseUrl}/users/me/meetings/${meetingUuid}/authorizations`, null).then(MeetingAuthorization.parseMany),
|
|
3532
|
+
|
|
3533
|
+
meetingAuthorizationReject: (meetingUuid , authorizationUuid ) =>
|
|
3534
|
+
client.put(
|
|
3535
|
+
`${baseUrl}/users/me/meetings/${meetingUuid}/authorizations/${authorizationUuid}/reject`,
|
|
3536
|
+
{},
|
|
3537
|
+
null,
|
|
3538
|
+
ApiRequester.successResponseParser,
|
|
3539
|
+
),
|
|
3540
|
+
|
|
3541
|
+
meetingAuthorizationAccept: (meetingUuid , authorizationUuid ) =>
|
|
3542
|
+
client.put(
|
|
3543
|
+
`${baseUrl}/users/me/meetings/${meetingUuid}/authorizations/${authorizationUuid}/accept`,
|
|
3544
|
+
{},
|
|
3545
|
+
null,
|
|
3546
|
+
ApiRequester.successResponseParser,
|
|
3547
|
+
),
|
|
3548
|
+
|
|
3420
3549
|
guestGetMeeting: (meetingUuid ) =>
|
|
3421
3550
|
client.get(`${baseUrl}/guests/me/meetings/${meetingUuid}`, null).then(Meeting.parse),
|
|
3551
|
+
|
|
3552
|
+
guestAuthorizationRequest: (userUuid , meetingUuid , username ) =>
|
|
3553
|
+
client
|
|
3554
|
+
.post(`${baseUrl}/guests/${userUuid}/meetings/${meetingUuid}/authorizations`, { guest_name: username })
|
|
3555
|
+
.then(MeetingAuthorization.parse),
|
|
3556
|
+
|
|
3557
|
+
guestAuthorizationCheck: (userUuid , meetingUuid , authorizationUuid ) =>
|
|
3558
|
+
client.get(`${baseUrl}/guests/${userUuid}/meetings/${meetingUuid}/authorizations/${authorizationUuid}`, null),
|
|
3559
|
+
|
|
3422
3560
|
});
|
|
3423
3561
|
|
|
3424
3562
|
//
|
|
@@ -5060,6 +5198,14 @@ var calldMethods = (client , baseUrl ) => ({
|
|
|
5060
5198
|
getMeetingParticipantsAsUser: async (meetingUuid ) =>
|
|
5061
5199
|
client.get(`${baseUrl}/users/me/meetings/${meetingUuid}/participants`),
|
|
5062
5200
|
|
|
5201
|
+
banMeetingParticipant: (meetingUuid , participantUuid ) =>
|
|
5202
|
+
client.delete(
|
|
5203
|
+
`${baseUrl}/users/me/meetings/${meetingUuid}/participants/${participantUuid}`,
|
|
5204
|
+
null,
|
|
5205
|
+
null,
|
|
5206
|
+
ApiRequester.successResponseParser,
|
|
5207
|
+
),
|
|
5208
|
+
|
|
5063
5209
|
listTrunks: () => client.get(`${baseUrl}/trunks`),
|
|
5064
5210
|
|
|
5065
5211
|
mute: (callId ) =>
|
|
@@ -5907,6 +6053,24 @@ const fixSdp = (sdp , candidates , forcePort = true)
|
|
|
5907
6053
|
return fixed;
|
|
5908
6054
|
};
|
|
5909
6055
|
|
|
6056
|
+
const addIcesInAllBundles = (sdp ) => {
|
|
6057
|
+
const parsedSdp = sdpParser__default['default'].parse(sdp);
|
|
6058
|
+
|
|
6059
|
+
const mediaWithCandidate = parsedSdp.media.find(media => !!media.candidates);
|
|
6060
|
+
if (!mediaWithCandidate) {
|
|
6061
|
+
return sdp;
|
|
6062
|
+
}
|
|
6063
|
+
|
|
6064
|
+
const { candidates } = mediaWithCandidate;
|
|
6065
|
+
|
|
6066
|
+
parsedSdp.media = parsedSdp.media.map(media => ({
|
|
6067
|
+
...media,
|
|
6068
|
+
candidates: media.candidates || candidates,
|
|
6069
|
+
}));
|
|
6070
|
+
|
|
6071
|
+
return sdpParser__default['default'].write(parsedSdp);
|
|
6072
|
+
};
|
|
6073
|
+
|
|
5910
6074
|
/* global RTCSessionDescriptionInit, navigator */
|
|
5911
6075
|
|
|
5912
6076
|
const wazoLogger = IssueReporter$1 ? IssueReporter$1.loggerFor('webrtc-sdh') : console;
|
|
@@ -6036,7 +6200,10 @@ class WazoSessionDescriptionHandler extends sessionDescriptionHandler.SessionDes
|
|
|
6036
6200
|
|
|
6037
6201
|
// Check if we got ICEs
|
|
6038
6202
|
if (sdp.indexOf('a=candidate') !== -1) {
|
|
6039
|
-
return
|
|
6203
|
+
return {
|
|
6204
|
+
type: description.type,
|
|
6205
|
+
sdp: addIcesInAllBundles(sdp),
|
|
6206
|
+
};
|
|
6040
6207
|
}
|
|
6041
6208
|
|
|
6042
6209
|
wazoLogger.info('No ICE candidates found in SDP, fixing it with gathered ices', this.gatheredCandidates);
|
|
@@ -7496,41 +7663,58 @@ class WebRTCClient extends Emitter {
|
|
|
7496
7663
|
});
|
|
7497
7664
|
}
|
|
7498
7665
|
|
|
7499
|
-
changeAudioInputDevice(id , session ) {
|
|
7666
|
+
async changeAudioInputDevice(id , session , force ) {
|
|
7500
7667
|
const currentId = this.getAudioDeviceId();
|
|
7501
7668
|
logger$9.info('setting audio input device', { id, currentId, session: !!session });
|
|
7502
7669
|
|
|
7503
|
-
if (id === currentId) {
|
|
7670
|
+
if (!force && id === currentId) {
|
|
7504
7671
|
return null;
|
|
7505
7672
|
}
|
|
7506
7673
|
|
|
7674
|
+
// in order to handle an audio track change for default devices
|
|
7675
|
+
// we need the actual id of the device (not 'default')
|
|
7676
|
+
let deviceId = id;
|
|
7677
|
+
if (id === 'default' && navigator.mediaDevices) {
|
|
7678
|
+
const devices = await navigator.mediaDevices.enumerateDevices();
|
|
7679
|
+
const defaultDevice = devices.find(device => device.deviceId === 'default');
|
|
7680
|
+
if (defaultDevice) {
|
|
7681
|
+
const deviceLabel = defaultDevice.label.replace('Default - ', '');
|
|
7682
|
+
const targetDevice = devices.find(device => device.label === deviceLabel);
|
|
7683
|
+
if (targetDevice) {
|
|
7684
|
+
deviceId = targetDevice.deviceId;
|
|
7685
|
+
if (!force && deviceId === currentId) {
|
|
7686
|
+
return null;
|
|
7687
|
+
}
|
|
7688
|
+
}
|
|
7689
|
+
}
|
|
7690
|
+
}
|
|
7691
|
+
|
|
7507
7692
|
// let's update the local audio value
|
|
7508
7693
|
if (this.audio) {
|
|
7509
7694
|
this.audio = {
|
|
7510
7695
|
deviceId: {
|
|
7511
|
-
exact:
|
|
7696
|
+
exact: deviceId,
|
|
7512
7697
|
},
|
|
7513
7698
|
};
|
|
7514
7699
|
}
|
|
7515
7700
|
|
|
7516
|
-
if (session) {
|
|
7701
|
+
if (session && navigator.mediaDevices) {
|
|
7517
7702
|
const sdh = session.sessionDescriptionHandler;
|
|
7518
7703
|
const pc = sdh.peerConnection;
|
|
7519
7704
|
|
|
7520
|
-
|
|
7521
|
-
|
|
7522
|
-
|
|
7523
|
-
|
|
7705
|
+
const constraints = { audio: { deviceId: { exact: deviceId } } };
|
|
7706
|
+
const stream = await navigator.mediaDevices.getUserMedia(constraints);
|
|
7707
|
+
const audioTrack = stream.getAudioTracks()[0];
|
|
7708
|
+
const sender = pc && pc.getSenders().find(s => audioTrack && s && s.track && s.track.kind === audioTrack.kind);
|
|
7524
7709
|
|
|
7525
|
-
|
|
7526
|
-
|
|
7527
|
-
|
|
7528
|
-
}
|
|
7529
|
-
sender.replaceTrack(audioTrack);
|
|
7710
|
+
if (sender) {
|
|
7711
|
+
if (sender.track) {
|
|
7712
|
+
audioTrack.enabled = sender.track.enabled;
|
|
7530
7713
|
}
|
|
7714
|
+
sender.replaceTrack(audioTrack);
|
|
7715
|
+
}
|
|
7531
7716
|
|
|
7532
|
-
|
|
7533
|
-
});
|
|
7717
|
+
return stream;
|
|
7534
7718
|
}
|
|
7535
7719
|
}
|
|
7536
7720
|
|
|
@@ -7550,14 +7734,14 @@ class WebRTCClient extends Emitter {
|
|
|
7550
7734
|
return null;
|
|
7551
7735
|
}
|
|
7552
7736
|
|
|
7553
|
-
// let's
|
|
7554
|
-
|
|
7555
|
-
|
|
7556
|
-
|
|
7557
|
-
|
|
7558
|
-
|
|
7559
|
-
}
|
|
7560
|
-
}
|
|
7737
|
+
// let's make sure we don't lose other video constraints settings -- width, height, frameRate...
|
|
7738
|
+
const videoObject = typeof this.video === 'object' ? this.video : {};
|
|
7739
|
+
this.video = {
|
|
7740
|
+
...videoObject,
|
|
7741
|
+
deviceId: {
|
|
7742
|
+
exact: id,
|
|
7743
|
+
},
|
|
7744
|
+
};
|
|
7561
7745
|
}
|
|
7562
7746
|
|
|
7563
7747
|
changeSessionVideoInputDevice(id , session ) {
|
|
@@ -9296,10 +9480,10 @@ class WebRTCPhone extends Emitter {
|
|
|
9296
9480
|
this.audioRingVolume = volume;
|
|
9297
9481
|
}
|
|
9298
9482
|
|
|
9299
|
-
changeAudioInputDevice(id ) {
|
|
9483
|
+
changeAudioInputDevice(id , force ) {
|
|
9300
9484
|
logger$8.info('WebRTC phone - changeAudio input device', { deviceId: id });
|
|
9301
9485
|
|
|
9302
|
-
return this.client.changeAudioInputDevice(id, this.currentSipSession);
|
|
9486
|
+
return this.client.changeAudioInputDevice(id, this.currentSipSession, force);
|
|
9303
9487
|
}
|
|
9304
9488
|
|
|
9305
9489
|
changeVideoInputDevice(id ) {
|
|
@@ -10835,6 +11019,7 @@ const AGENT_UNPAUSED = 'agent_unpaused';
|
|
|
10835
11019
|
const CONFERENCE_ADHOC_PARTICIPANT_LEFT = 'conference_adhoc_participant_left';
|
|
10836
11020
|
const CONFERENCE_ADHOC_DELETED = 'conference_adhoc_deleted';
|
|
10837
11021
|
const MEETING_USER_PROGRESS = 'meeting_user_progress';
|
|
11022
|
+
const MEETING_USER_GUEST_AUTHORIZATION_CREATED = 'meeting_user_guest_authorization_created';
|
|
10838
11023
|
|
|
10839
11024
|
const BLACKLIST_EVENTS = [
|
|
10840
11025
|
CHAT_MESSAGE_SENT,
|
|
@@ -11186,6 +11371,7 @@ WebSocketClient.eventLists = [
|
|
|
11186
11371
|
CONFERENCE_ADHOC_PARTICIPANT_LEFT,
|
|
11187
11372
|
CONFERENCE_ADHOC_DELETED,
|
|
11188
11373
|
MEETING_USER_PROGRESS,
|
|
11374
|
+
MEETING_USER_GUEST_AUTHORIZATION_CREATED,
|
|
11189
11375
|
];
|
|
11190
11376
|
|
|
11191
11377
|
var WebSocketClient$1 = /*#__PURE__*/Object.freeze({
|
|
@@ -11257,6 +11443,7 @@ var WebSocketClient$1 = /*#__PURE__*/Object.freeze({
|
|
|
11257
11443
|
CONFERENCE_ADHOC_PARTICIPANT_LEFT: CONFERENCE_ADHOC_PARTICIPANT_LEFT,
|
|
11258
11444
|
CONFERENCE_ADHOC_DELETED: CONFERENCE_ADHOC_DELETED,
|
|
11259
11445
|
MEETING_USER_PROGRESS: MEETING_USER_PROGRESS,
|
|
11446
|
+
MEETING_USER_GUEST_AUTHORIZATION_CREATED: MEETING_USER_GUEST_AUTHORIZATION_CREATED,
|
|
11260
11447
|
HEARTBEAT_ENGINE_VERSION: HEARTBEAT_ENGINE_VERSION,
|
|
11261
11448
|
'default': WebSocketClient
|
|
11262
11449
|
});
|
|
@@ -11361,6 +11548,7 @@ class Participant extends Emitter {
|
|
|
11361
11548
|
|
|
11362
11549
|
|
|
11363
11550
|
|
|
11551
|
+
|
|
11364
11552
|
|
|
11365
11553
|
|
|
11366
11554
|
|
|
@@ -11378,6 +11566,7 @@ class Participant extends Emitter {
|
|
|
11378
11566
|
|
|
11379
11567
|
|
|
11380
11568
|
|
|
11569
|
+
|
|
11381
11570
|
|
|
11382
11571
|
/**
|
|
11383
11572
|
* @param room Room The room where the participant is
|
|
@@ -11401,6 +11590,7 @@ class Participant extends Emitter {
|
|
|
11401
11590
|
this.screensharing = false;
|
|
11402
11591
|
this.isOnHold = false;
|
|
11403
11592
|
this.extra = extra;
|
|
11593
|
+
this.banned = false;
|
|
11404
11594
|
|
|
11405
11595
|
this.ON_UPDATED = 'participant/ON_UPDATED';
|
|
11406
11596
|
this.ON_START_TALKING = 'participant/ON_START_TALKING';
|
|
@@ -11417,6 +11607,7 @@ class Participant extends Emitter {
|
|
|
11417
11607
|
this.ON_EXTRA_CHANGE = 'participant/ON_EXTRA_CHANGE';
|
|
11418
11608
|
this.ON_HOLD = 'participant/ON_HOLD';
|
|
11419
11609
|
this.ON_RESUME = 'participant/ON_RESUME';
|
|
11610
|
+
this.ON_BAN = 'participant/ON_BAN';
|
|
11420
11611
|
}
|
|
11421
11612
|
|
|
11422
11613
|
triggerEvent(name , ...args ) {
|
|
@@ -11457,6 +11648,10 @@ class Participant extends Emitter {
|
|
|
11457
11648
|
status.extra = this.extra;
|
|
11458
11649
|
break;
|
|
11459
11650
|
}
|
|
11651
|
+
case this.ON_BAN: {
|
|
11652
|
+
status.banned = true;
|
|
11653
|
+
break;
|
|
11654
|
+
}
|
|
11460
11655
|
}
|
|
11461
11656
|
|
|
11462
11657
|
if (broadcast) {
|
|
@@ -11559,6 +11754,11 @@ class Participant extends Emitter {
|
|
|
11559
11754
|
this.triggerUpdate(this.ON_RESUME, broadcast);
|
|
11560
11755
|
}
|
|
11561
11756
|
|
|
11757
|
+
onBan(broadcast = true) {
|
|
11758
|
+
this.banned = true;
|
|
11759
|
+
this.triggerUpdate(this.ON_BAN, broadcast);
|
|
11760
|
+
}
|
|
11761
|
+
|
|
11562
11762
|
getStatus() {
|
|
11563
11763
|
return {
|
|
11564
11764
|
callId: this.callId,
|
|
@@ -11605,6 +11805,10 @@ class Participant extends Emitter {
|
|
|
11605
11805
|
}
|
|
11606
11806
|
}
|
|
11607
11807
|
|
|
11808
|
+
if (status.banned) {
|
|
11809
|
+
this.onBan(false);
|
|
11810
|
+
}
|
|
11811
|
+
|
|
11608
11812
|
// Poor man's object comparison
|
|
11609
11813
|
if (typeof status.extra !== 'undefined' && JSON.stringify(this.extra) !== JSON.stringify(status.extra)) {
|
|
11610
11814
|
this.extra = { ...this.extra, ...status.extra };
|
|
@@ -11632,6 +11836,28 @@ class Participant extends Emitter {
|
|
|
11632
11836
|
this.streams = streams;
|
|
11633
11837
|
this.videoStreams = streams;
|
|
11634
11838
|
}
|
|
11839
|
+
|
|
11840
|
+
async ban(apiRequestDelay = null) {
|
|
11841
|
+
const { meetingUuid } = this.room;
|
|
11842
|
+
if (!meetingUuid) {
|
|
11843
|
+
throw new Error('Attempting to ban a participant without a `meetingUuid`');
|
|
11844
|
+
}
|
|
11845
|
+
|
|
11846
|
+
// this notifies all that someone is being banned
|
|
11847
|
+
this.onBan(true);
|
|
11848
|
+
|
|
11849
|
+
// this allows to delay the actual ban, in order for the banned participant as well as others to react to the situation
|
|
11850
|
+
if (apiRequestDelay) {
|
|
11851
|
+
await this.delay(apiRequestDelay);
|
|
11852
|
+
}
|
|
11853
|
+
|
|
11854
|
+
// proceed with the actual kick
|
|
11855
|
+
return getApiClient().calld.banMeetingParticipant(meetingUuid, this.callId);
|
|
11856
|
+
}
|
|
11857
|
+
|
|
11858
|
+
async delay(ms ) {
|
|
11859
|
+
return new Promise(resolve => setTimeout(resolve, ms));
|
|
11860
|
+
}
|
|
11635
11861
|
}
|
|
11636
11862
|
|
|
11637
11863
|
//
|
|
@@ -11784,7 +12010,7 @@ class Room$1 extends Emitter {
|
|
|
11784
12010
|
logger$3.info('connecting to room', { extension, audioOnly, room: !!room });
|
|
11785
12011
|
|
|
11786
12012
|
if (!room) {
|
|
11787
|
-
await Wazo.Phone.connect();
|
|
12013
|
+
await Wazo.Phone.connect({ media: constraints });
|
|
11788
12014
|
|
|
11789
12015
|
const withCamera = constraints && !!constraints.video;
|
|
11790
12016
|
|
|
@@ -12229,7 +12455,7 @@ class Room$1 extends Emitter {
|
|
|
12229
12455
|
const participant = this._getParticipantFromCallId(status.callId);
|
|
12230
12456
|
|
|
12231
12457
|
if (participant) {
|
|
12232
|
-
// we're
|
|
12458
|
+
// we're receiving, so no need to broadcast
|
|
12233
12459
|
participant.updateStatus(status, false);
|
|
12234
12460
|
}
|
|
12235
12461
|
break;
|
|
@@ -12496,7 +12722,7 @@ class SipRoom extends Room$1 {
|
|
|
12496
12722
|
logger$2.info('connecting to sip room', { extension, audioOnly, room: !!room });
|
|
12497
12723
|
|
|
12498
12724
|
if (!room) {
|
|
12499
|
-
await Wazo.Phone.connect();
|
|
12725
|
+
await Wazo.Phone.connect({ media: constraints });
|
|
12500
12726
|
|
|
12501
12727
|
const withCamera = constraints && !!constraints.video;
|
|
12502
12728
|
|
package/lib/simple/Websocket.js
CHANGED
|
@@ -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 WebSocketClient$1 = /*#__PURE__*/Object.freeze({
|
|
@@ -1037,6 +1039,7 @@ var WebSocketClient$1 = /*#__PURE__*/Object.freeze({
|
|
|
1037
1039
|
CONFERENCE_ADHOC_PARTICIPANT_LEFT: CONFERENCE_ADHOC_PARTICIPANT_LEFT,
|
|
1038
1040
|
CONFERENCE_ADHOC_DELETED: CONFERENCE_ADHOC_DELETED,
|
|
1039
1041
|
MEETING_USER_PROGRESS: MEETING_USER_PROGRESS,
|
|
1042
|
+
MEETING_USER_GUEST_AUTHORIZATION_CREATED: MEETING_USER_GUEST_AUTHORIZATION_CREATED,
|
|
1040
1043
|
HEARTBEAT_ENGINE_VERSION: HEARTBEAT_ENGINE_VERSION,
|
|
1041
1044
|
'default': WebSocketClient
|
|
1042
1045
|
});
|