@wazo/sdk 0.38.6 → 0.38.9
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 +249 -28
- 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 +205 -25
- package/esm/checker/checks/aor.js +142 -2
- package/esm/checker/checks/api.js +142 -2
- package/esm/checker/checks/index.js +205 -25
- package/esm/checker/checks/wazo-websocket.js +2 -0
- package/esm/checker/checks/webrtc-transport.js +203 -25
- package/esm/checker/checks/webrtc.js +203 -25
- 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/Phone/WebRTCPhone.js +1 -3
- package/esm/domain/__tests__/Meeting.test.js +87 -1
- package/esm/domain/__tests__/MeetingAuthorization.test.js +109 -0
- package/esm/index.js +249 -31
- package/esm/lib/WazoSessionDescriptionHandler.js +22 -1
- package/esm/service/CallApi.js +142 -2
- package/esm/service/getApiClient.js +142 -2
- package/esm/simple/Auth.js +249 -31
- package/esm/simple/Configuration.js +249 -31
- package/esm/simple/Directory.js +142 -2
- package/esm/simple/Phone.js +249 -31
- package/esm/simple/Websocket.js +3 -0
- package/esm/simple/index.js +249 -31
- package/esm/simple/room/LocalParticipant.js +249 -31
- package/esm/simple/room/Participant.js +249 -31
- package/esm/simple/room/RemoteParticipant.js +249 -31
- package/esm/simple/room/Room.js +249 -31
- package/esm/simple/room/SipRoom.js +249 -31
- package/esm/simple/room/Stream.js +249 -31
- package/esm/simple/room/__tests__/Participant.test.js +14745 -0
- package/esm/simple/room/__tests__/RemoteParticipant.test.js +249 -31
- package/esm/simple/utils.js +249 -31
- 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 +203 -25
- package/esm/websocket-client.js +3 -1
- package/lib/__tests__/api-client.test.js +142 -2
- package/lib/__tests__/web-rtc-client.test.js +249 -28
- 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 +205 -25
- package/lib/checker/checks/aor.js +142 -2
- package/lib/checker/checks/api.js +142 -2
- package/lib/checker/checks/index.js +205 -25
- package/lib/checker/checks/wazo-websocket.js +2 -0
- package/lib/checker/checks/webrtc-transport.js +203 -25
- package/lib/checker/checks/webrtc.js +203 -25
- 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/Phone/WebRTCPhone.js +1 -3
- package/lib/domain/__tests__/Meeting.test.js +87 -1
- package/lib/domain/__tests__/MeetingAuthorization.test.js +111 -0
- package/lib/index.js +249 -31
- package/lib/lib/WazoSessionDescriptionHandler.js +22 -1
- package/lib/service/CallApi.js +142 -2
- package/lib/service/getApiClient.js +142 -2
- package/lib/simple/Auth.js +249 -31
- package/lib/simple/Configuration.js +249 -31
- package/lib/simple/Directory.js +142 -2
- package/lib/simple/Phone.js +249 -31
- package/lib/simple/Websocket.js +3 -0
- package/lib/simple/index.js +249 -31
- package/lib/simple/room/LocalParticipant.js +249 -31
- package/lib/simple/room/Participant.js +249 -31
- package/lib/simple/room/RemoteParticipant.js +249 -31
- package/lib/simple/room/Room.js +249 -31
- package/lib/simple/room/SipRoom.js +249 -31
- package/lib/simple/room/Stream.js +249 -31
- package/lib/simple/room/__tests__/Participant.test.js +14755 -0
- package/lib/simple/room/__tests__/RemoteParticipant.test.js +249 -31
- package/lib/simple/utils.js +249 -31
- 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 +203 -25
- 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/Phone/WebRTCPhone.js +1 -3
- 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 +39 -22
- package/src/websocket-client.js +2 -0
|
@@ -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 };
|
package/esm/web-rtc-client.js
CHANGED
|
@@ -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
|
//
|
|
@@ -4780,6 +4933,14 @@ var calldMethods = (client , baseUrl ) => ({
|
|
|
4780
4933
|
getMeetingParticipantsAsUser: async (meetingUuid ) =>
|
|
4781
4934
|
client.get(`${baseUrl}/users/me/meetings/${meetingUuid}/participants`),
|
|
4782
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
|
+
|
|
4783
4944
|
listTrunks: () => client.get(`${baseUrl}/trunks`),
|
|
4784
4945
|
|
|
4785
4946
|
mute: (callId ) =>
|
|
@@ -6423,7 +6584,7 @@ class WebRTCClient extends Emitter {
|
|
|
6423
6584
|
});
|
|
6424
6585
|
}
|
|
6425
6586
|
|
|
6426
|
-
changeAudioInputDevice(id , session , force ) {
|
|
6587
|
+
async changeAudioInputDevice(id , session , force ) {
|
|
6427
6588
|
const currentId = this.getAudioDeviceId();
|
|
6428
6589
|
logger.info('setting audio input device', { id, currentId, session: !!session });
|
|
6429
6590
|
|
|
@@ -6431,33 +6592,50 @@ class WebRTCClient extends Emitter {
|
|
|
6431
6592
|
return null;
|
|
6432
6593
|
}
|
|
6433
6594
|
|
|
6595
|
+
// in order to handle an audio track change for default devices
|
|
6596
|
+
// we need the actual id of the device (not 'default')
|
|
6597
|
+
let deviceId = id;
|
|
6598
|
+
if (id === 'default' && navigator.mediaDevices) {
|
|
6599
|
+
const devices = await navigator.mediaDevices.enumerateDevices();
|
|
6600
|
+
const defaultDevice = devices.find(device => device.deviceId === 'default');
|
|
6601
|
+
if (defaultDevice) {
|
|
6602
|
+
const deviceLabel = defaultDevice.label.replace('Default - ', '');
|
|
6603
|
+
const targetDevice = devices.find(device => device.label === deviceLabel);
|
|
6604
|
+
if (targetDevice) {
|
|
6605
|
+
deviceId = targetDevice.deviceId;
|
|
6606
|
+
if (!force && deviceId === currentId) {
|
|
6607
|
+
return null;
|
|
6608
|
+
}
|
|
6609
|
+
}
|
|
6610
|
+
}
|
|
6611
|
+
}
|
|
6612
|
+
|
|
6434
6613
|
// let's update the local audio value
|
|
6435
6614
|
if (this.audio) {
|
|
6436
6615
|
this.audio = {
|
|
6437
6616
|
deviceId: {
|
|
6438
|
-
exact:
|
|
6617
|
+
exact: deviceId,
|
|
6439
6618
|
},
|
|
6440
6619
|
};
|
|
6441
6620
|
}
|
|
6442
6621
|
|
|
6443
|
-
if (session) {
|
|
6622
|
+
if (session && navigator.mediaDevices) {
|
|
6444
6623
|
const sdh = session.sessionDescriptionHandler;
|
|
6445
6624
|
const pc = sdh.peerConnection;
|
|
6446
6625
|
|
|
6447
|
-
|
|
6448
|
-
|
|
6449
|
-
|
|
6450
|
-
|
|
6626
|
+
const constraints = { audio: { deviceId: { exact: deviceId } } };
|
|
6627
|
+
const stream = await navigator.mediaDevices.getUserMedia(constraints);
|
|
6628
|
+
const audioTrack = stream.getAudioTracks()[0];
|
|
6629
|
+
const sender = pc && pc.getSenders().find(s => audioTrack && s && s.track && s.track.kind === audioTrack.kind);
|
|
6451
6630
|
|
|
6452
|
-
|
|
6453
|
-
|
|
6454
|
-
|
|
6455
|
-
}
|
|
6456
|
-
sender.replaceTrack(audioTrack);
|
|
6631
|
+
if (sender) {
|
|
6632
|
+
if (sender.track) {
|
|
6633
|
+
audioTrack.enabled = sender.track.enabled;
|
|
6457
6634
|
}
|
|
6635
|
+
sender.replaceTrack(audioTrack);
|
|
6636
|
+
}
|
|
6458
6637
|
|
|
6459
|
-
|
|
6460
|
-
});
|
|
6638
|
+
return stream;
|
|
6461
6639
|
}
|
|
6462
6640
|
}
|
|
6463
6641
|
|
|
@@ -6477,14 +6655,14 @@ class WebRTCClient extends Emitter {
|
|
|
6477
6655
|
return null;
|
|
6478
6656
|
}
|
|
6479
6657
|
|
|
6480
|
-
// let's
|
|
6481
|
-
|
|
6482
|
-
|
|
6483
|
-
|
|
6484
|
-
|
|
6485
|
-
|
|
6486
|
-
}
|
|
6487
|
-
}
|
|
6658
|
+
// let's make sure we don't lose other video constraints settings -- width, height, frameRate...
|
|
6659
|
+
const videoObject = typeof this.video === 'object' ? this.video : {};
|
|
6660
|
+
this.video = {
|
|
6661
|
+
...videoObject,
|
|
6662
|
+
deviceId: {
|
|
6663
|
+
exact: id,
|
|
6664
|
+
},
|
|
6665
|
+
};
|
|
6488
6666
|
}
|
|
6489
6667
|
|
|
6490
6668
|
changeSessionVideoInputDevice(id , session ) {
|
package/esm/websocket-client.js
CHANGED
|
@@ -607,6 +607,7 @@ const AGENT_UNPAUSED = 'agent_unpaused';
|
|
|
607
607
|
const CONFERENCE_ADHOC_PARTICIPANT_LEFT = 'conference_adhoc_participant_left';
|
|
608
608
|
const CONFERENCE_ADHOC_DELETED = 'conference_adhoc_deleted';
|
|
609
609
|
const MEETING_USER_PROGRESS = 'meeting_user_progress';
|
|
610
|
+
const MEETING_USER_GUEST_AUTHORIZATION_CREATED = 'meeting_user_guest_authorization_created';
|
|
610
611
|
|
|
611
612
|
const BLACKLIST_EVENTS = [
|
|
612
613
|
CHAT_MESSAGE_SENT,
|
|
@@ -958,7 +959,8 @@ WebSocketClient.eventLists = [
|
|
|
958
959
|
CONFERENCE_ADHOC_PARTICIPANT_LEFT,
|
|
959
960
|
CONFERENCE_ADHOC_DELETED,
|
|
960
961
|
MEETING_USER_PROGRESS,
|
|
962
|
+
MEETING_USER_GUEST_AUTHORIZATION_CREATED,
|
|
961
963
|
];
|
|
962
964
|
|
|
963
965
|
export default WebSocketClient;
|
|
964
|
-
export { AGENT_PAUSED, AGENT_STATUS_UPDATE, AGENT_UNPAUSED, APPLICATION_CALL_ANSWERED, APPLICATION_CALL_DELETED, APPLICATION_CALL_DTMF_RECEIVED, APPLICATION_CALL_ENTERED, APPLICATION_CALL_INITIATED, APPLICATION_CALL_UPDATED, APPLICATION_DESTINATION_NODE_CREATED, APPLICATION_NODE_CREATED, APPLICATION_NODE_DELETED, APPLICATION_NODE_UPDATED, APPLICATION_PLAYBACK_CREATED, APPLICATION_PLAYBACK_DELETED, APPLICATION_PROGRESS_STARTED, APPLICATION_PROGRESS_STOPPED, APPLICATION_SNOOP_CREATED, APPLICATION_SNOOP_DELETED, APPLICATION_SNOOP_UPDATED, APPLICATION_USER_OUTGOING_CALL_CREATED, AUTH_SESSION_EXPIRE_SOON, AUTH_USER_EXTERNAL_AUTH_ADDED, AUTH_USER_EXTERNAL_AUTH_DELETED, CALL_ANSWERED, CALL_CREATED, CALL_DTMF_CREATED, CALL_ENDED, CALL_HELD, CALL_LOG_USER_CREATED, CALL_RESUMED, CALL_UPDATED, CHATD_PRESENCE_UPDATED, CHATD_USER_ROOM_CREATED, CHATD_USER_ROOM_MESSAGE_CREATED, CHAT_MESSAGE_RECEIVED, CHAT_MESSAGE_SENT, CONFERENCE_ADHOC_DELETED, CONFERENCE_ADHOC_PARTICIPANT_LEFT, CONFERENCE_USER_PARTICIPANT_JOINED, CONFERENCE_USER_PARTICIPANT_LEFT, CONFERENCE_USER_PARTICIPANT_TALK_STARTED, CONFERENCE_USER_PARTICIPANT_TALK_STOPPED, ENDPOINT_STATUS_UPDATE, FAVORITE_ADDED, FAVORITE_DELETED, FAX_OUTBOUND_USER_CREATED, FAX_OUTBOUND_USER_FAILED, FAX_OUTBOUND_USER_SUCCEEDED, HEARTBEAT_ENGINE_VERSION, LINE_STATUS_UPDATED, MEETING_USER_PARTICIPANT_JOINED, MEETING_USER_PARTICIPANT_LEFT, MEETING_USER_PROGRESS, SOCKET_EVENTS, SWITCHBOARD_HELD_CALLS_UPDATED, SWITCHBOARD_HELD_CALL_ANSWERED, SWITCHBOARD_QUEUED_CALLS_UPDATED, SWITCHBOARD_QUEUED_CALL_ANSWERED, TRUNK_STATUS_UPDATED, USERS_FORWARDS_BUSY_UPDATED, USERS_FORWARDS_NOANSWER_UPDATED, USERS_FORWARDS_UNCONDITIONAL_UPDATED, USERS_SERVICES_DND_UPDATED, USER_STATUS_UPDATE, USER_VOICEMAIL_MESSAGE_CREATED, USER_VOICEMAIL_MESSAGE_DELETED, USER_VOICEMAIL_MESSAGE_UPDATED };
|
|
966
|
+
export { AGENT_PAUSED, AGENT_STATUS_UPDATE, AGENT_UNPAUSED, APPLICATION_CALL_ANSWERED, APPLICATION_CALL_DELETED, APPLICATION_CALL_DTMF_RECEIVED, APPLICATION_CALL_ENTERED, APPLICATION_CALL_INITIATED, APPLICATION_CALL_UPDATED, APPLICATION_DESTINATION_NODE_CREATED, APPLICATION_NODE_CREATED, APPLICATION_NODE_DELETED, APPLICATION_NODE_UPDATED, APPLICATION_PLAYBACK_CREATED, APPLICATION_PLAYBACK_DELETED, APPLICATION_PROGRESS_STARTED, APPLICATION_PROGRESS_STOPPED, APPLICATION_SNOOP_CREATED, APPLICATION_SNOOP_DELETED, APPLICATION_SNOOP_UPDATED, APPLICATION_USER_OUTGOING_CALL_CREATED, AUTH_SESSION_EXPIRE_SOON, AUTH_USER_EXTERNAL_AUTH_ADDED, AUTH_USER_EXTERNAL_AUTH_DELETED, CALL_ANSWERED, CALL_CREATED, CALL_DTMF_CREATED, CALL_ENDED, CALL_HELD, CALL_LOG_USER_CREATED, CALL_RESUMED, CALL_UPDATED, CHATD_PRESENCE_UPDATED, CHATD_USER_ROOM_CREATED, CHATD_USER_ROOM_MESSAGE_CREATED, CHAT_MESSAGE_RECEIVED, CHAT_MESSAGE_SENT, CONFERENCE_ADHOC_DELETED, CONFERENCE_ADHOC_PARTICIPANT_LEFT, CONFERENCE_USER_PARTICIPANT_JOINED, CONFERENCE_USER_PARTICIPANT_LEFT, CONFERENCE_USER_PARTICIPANT_TALK_STARTED, CONFERENCE_USER_PARTICIPANT_TALK_STOPPED, ENDPOINT_STATUS_UPDATE, FAVORITE_ADDED, FAVORITE_DELETED, FAX_OUTBOUND_USER_CREATED, FAX_OUTBOUND_USER_FAILED, FAX_OUTBOUND_USER_SUCCEEDED, HEARTBEAT_ENGINE_VERSION, LINE_STATUS_UPDATED, MEETING_USER_GUEST_AUTHORIZATION_CREATED, MEETING_USER_PARTICIPANT_JOINED, MEETING_USER_PARTICIPANT_LEFT, MEETING_USER_PROGRESS, SOCKET_EVENTS, SWITCHBOARD_HELD_CALLS_UPDATED, SWITCHBOARD_HELD_CALL_ANSWERED, SWITCHBOARD_QUEUED_CALLS_UPDATED, SWITCHBOARD_QUEUED_CALL_ANSWERED, TRUNK_STATUS_UPDATED, USERS_FORWARDS_BUSY_UPDATED, USERS_FORWARDS_NOANSWER_UPDATED, USERS_FORWARDS_UNCONDITIONAL_UPDATED, USERS_SERVICES_DND_UPDATED, USER_STATUS_UPDATE, USER_VOICEMAIL_MESSAGE_CREATED, USER_VOICEMAIL_MESSAGE_DELETED, USER_VOICEMAIL_MESSAGE_UPDATED };
|
|
@@ -2631,6 +2631,70 @@ class ExternalApp {
|
|
|
2631
2631
|
|
|
2632
2632
|
//
|
|
2633
2633
|
|
|
2634
|
+
class MeetingAuthorization {
|
|
2635
|
+
|
|
2636
|
+
|
|
2637
|
+
|
|
2638
|
+
|
|
2639
|
+
|
|
2640
|
+
|
|
2641
|
+
constructor({
|
|
2642
|
+
meetingUuid,
|
|
2643
|
+
uuid,
|
|
2644
|
+
userUuid,
|
|
2645
|
+
userName,
|
|
2646
|
+
} = {}) {
|
|
2647
|
+
this.meetingUuid = meetingUuid;
|
|
2648
|
+
this.uuid = uuid;
|
|
2649
|
+
this.userUuid = userUuid;
|
|
2650
|
+
this.userName = userName;
|
|
2651
|
+
}
|
|
2652
|
+
|
|
2653
|
+
setStatus(status ) {
|
|
2654
|
+
this.status = status;
|
|
2655
|
+
}
|
|
2656
|
+
|
|
2657
|
+
getStatus() {
|
|
2658
|
+
return this.status;
|
|
2659
|
+
}
|
|
2660
|
+
|
|
2661
|
+
static parse(plain ) {
|
|
2662
|
+
const {
|
|
2663
|
+
meeting_uuid: meetingUuid,
|
|
2664
|
+
uuid,
|
|
2665
|
+
guest_uuid: userUuid,
|
|
2666
|
+
guest_name: userName,
|
|
2667
|
+
} = plain;
|
|
2668
|
+
|
|
2669
|
+
return new MeetingAuthorization({
|
|
2670
|
+
meetingUuid,
|
|
2671
|
+
uuid,
|
|
2672
|
+
userUuid,
|
|
2673
|
+
userName,
|
|
2674
|
+
});
|
|
2675
|
+
}
|
|
2676
|
+
|
|
2677
|
+
static parseMany(items ) {
|
|
2678
|
+
if (!items) {
|
|
2679
|
+
return [];
|
|
2680
|
+
}
|
|
2681
|
+
return items.map(MeetingAuthorization.parse);
|
|
2682
|
+
}
|
|
2683
|
+
}
|
|
2684
|
+
|
|
2685
|
+
//
|
|
2686
|
+
|
|
2687
|
+
|
|
2688
|
+
|
|
2689
|
+
|
|
2690
|
+
|
|
2691
|
+
|
|
2692
|
+
|
|
2693
|
+
|
|
2694
|
+
|
|
2695
|
+
|
|
2696
|
+
|
|
2697
|
+
|
|
2634
2698
|
|
|
2635
2699
|
|
|
2636
2700
|
|
|
@@ -2641,6 +2705,7 @@ class ExternalApp {
|
|
|
2641
2705
|
|
|
2642
2706
|
|
|
2643
2707
|
|
|
2708
|
+
|
|
2644
2709
|
|
|
2645
2710
|
|
|
2646
2711
|
class Meeting {
|
|
@@ -2655,6 +2720,8 @@ class Meeting {
|
|
|
2655
2720
|
|
|
2656
2721
|
|
|
2657
2722
|
|
|
2723
|
+
|
|
2724
|
+
|
|
2658
2725
|
|
|
2659
2726
|
static parse(plain ) {
|
|
2660
2727
|
return new Meeting({
|
|
@@ -2667,6 +2734,7 @@ class Meeting {
|
|
|
2667
2734
|
extension: plain.exten,
|
|
2668
2735
|
persistent: plain.persistent,
|
|
2669
2736
|
creationTime: moment__default['default'](plain.creation_time).toDate(),
|
|
2737
|
+
requireAuthorization: plain.require_authorization,
|
|
2670
2738
|
});
|
|
2671
2739
|
}
|
|
2672
2740
|
|
|
@@ -2691,6 +2759,7 @@ class Meeting {
|
|
|
2691
2759
|
extension,
|
|
2692
2760
|
persistent,
|
|
2693
2761
|
creationTime,
|
|
2762
|
+
requireAuthorization,
|
|
2694
2763
|
} = {}) {
|
|
2695
2764
|
this.guestSipAuthorization = guestSipAuthorization;
|
|
2696
2765
|
this.uri = uri;
|
|
@@ -2701,6 +2770,7 @@ class Meeting {
|
|
|
2701
2770
|
this.extension = extension;
|
|
2702
2771
|
this.persistent = persistent;
|
|
2703
2772
|
this.creationTime = creationTime;
|
|
2773
|
+
this.requireAuthorization = requireAuthorization;
|
|
2704
2774
|
|
|
2705
2775
|
// Useful to compare instead of instanceof with minified code
|
|
2706
2776
|
this.type = 'Meeting';
|
|
@@ -2711,8 +2781,32 @@ class Meeting {
|
|
|
2711
2781
|
const [username, secret] = atob(this.guestSipAuthorization).split(':');
|
|
2712
2782
|
return { username, secret };
|
|
2713
2783
|
}
|
|
2784
|
+
|
|
2714
2785
|
}
|
|
2715
2786
|
|
|
2787
|
+
//
|
|
2788
|
+
|
|
2789
|
+
const camelToUnderscore = (key ) => {
|
|
2790
|
+
if (typeof key !== 'string') {
|
|
2791
|
+
throw new Error('Input is not a string');
|
|
2792
|
+
}
|
|
2793
|
+
return key.charAt(0).toLowerCase() + key.substring(1).replace(/([A-Z])/g, '_$1').toLowerCase();
|
|
2794
|
+
};
|
|
2795
|
+
|
|
2796
|
+
//
|
|
2797
|
+
|
|
2798
|
+
const convertKeysFromCamelToUnderscore = (args ) => {
|
|
2799
|
+
if (!args || typeof args !== 'object' || Array.isArray(args)) {
|
|
2800
|
+
throw new Error('Input is not an object');
|
|
2801
|
+
}
|
|
2802
|
+
|
|
2803
|
+
return Object.keys(args).reduce((acc, key) => {
|
|
2804
|
+
acc[camelToUnderscore(key)] = typeof args[key] === 'object' && !Array.isArray(args[key])
|
|
2805
|
+
? convertKeysFromCamelToUnderscore(args[key]) : args[key];
|
|
2806
|
+
return acc;
|
|
2807
|
+
}, {});
|
|
2808
|
+
};
|
|
2809
|
+
|
|
2716
2810
|
/* */
|
|
2717
2811
|
|
|
2718
2812
|
var confdMethods = (client , baseUrl ) => ({
|
|
@@ -2781,8 +2875,18 @@ var confdMethods = (client , baseUrl ) => ({
|
|
|
2781
2875
|
getMyMeetings: () =>
|
|
2782
2876
|
client.get(`${baseUrl}/users/me/meetings`).then(response => Meeting.parseMany(response.items)),
|
|
2783
2877
|
|
|
2784
|
-
createMyMeeting: (
|
|
2785
|
-
client
|
|
2878
|
+
createMyMeeting: (args ) =>
|
|
2879
|
+
client
|
|
2880
|
+
.post(`${baseUrl}/users/me/meetings`, convertKeysFromCamelToUnderscore(args))
|
|
2881
|
+
.then(Meeting.parse),
|
|
2882
|
+
|
|
2883
|
+
updateMyMeeting: (meetingUuid , data ) =>
|
|
2884
|
+
client.put(
|
|
2885
|
+
`${baseUrl}/users/me/meetings/${meetingUuid}`,
|
|
2886
|
+
convertKeysFromCamelToUnderscore(data),
|
|
2887
|
+
null,
|
|
2888
|
+
ApiRequester.successResponseParser,
|
|
2889
|
+
),
|
|
2786
2890
|
|
|
2787
2891
|
deleteMyMeeting: (meetingUuid ) =>
|
|
2788
2892
|
client.delete(`${baseUrl}/users/me/meetings/${meetingUuid}`, null),
|
|
@@ -2790,8 +2894,36 @@ var confdMethods = (client , baseUrl ) => ({
|
|
|
2790
2894
|
getMeeting: (meetingUuid ) =>
|
|
2791
2895
|
client.get(`${baseUrl}/meetings/${meetingUuid}`, null).then(Meeting.parse),
|
|
2792
2896
|
|
|
2897
|
+
meetingAuthorizations: (meetingUuid ) =>
|
|
2898
|
+
client.get(`${baseUrl}/users/me/meetings/${meetingUuid}/authorizations`, null).then(MeetingAuthorization.parseMany),
|
|
2899
|
+
|
|
2900
|
+
meetingAuthorizationReject: (meetingUuid , authorizationUuid ) =>
|
|
2901
|
+
client.put(
|
|
2902
|
+
`${baseUrl}/users/me/meetings/${meetingUuid}/authorizations/${authorizationUuid}/reject`,
|
|
2903
|
+
{},
|
|
2904
|
+
null,
|
|
2905
|
+
ApiRequester.successResponseParser,
|
|
2906
|
+
),
|
|
2907
|
+
|
|
2908
|
+
meetingAuthorizationAccept: (meetingUuid , authorizationUuid ) =>
|
|
2909
|
+
client.put(
|
|
2910
|
+
`${baseUrl}/users/me/meetings/${meetingUuid}/authorizations/${authorizationUuid}/accept`,
|
|
2911
|
+
{},
|
|
2912
|
+
null,
|
|
2913
|
+
ApiRequester.successResponseParser,
|
|
2914
|
+
),
|
|
2915
|
+
|
|
2793
2916
|
guestGetMeeting: (meetingUuid ) =>
|
|
2794
2917
|
client.get(`${baseUrl}/guests/me/meetings/${meetingUuid}`, null).then(Meeting.parse),
|
|
2918
|
+
|
|
2919
|
+
guestAuthorizationRequest: (userUuid , meetingUuid , username ) =>
|
|
2920
|
+
client
|
|
2921
|
+
.post(`${baseUrl}/guests/${userUuid}/meetings/${meetingUuid}/authorizations`, { guest_name: username })
|
|
2922
|
+
.then(MeetingAuthorization.parse),
|
|
2923
|
+
|
|
2924
|
+
guestAuthorizationCheck: (userUuid , meetingUuid , authorizationUuid ) =>
|
|
2925
|
+
client.get(`${baseUrl}/guests/${userUuid}/meetings/${meetingUuid}/authorizations/${authorizationUuid}`, null),
|
|
2926
|
+
|
|
2795
2927
|
});
|
|
2796
2928
|
|
|
2797
2929
|
//
|
|
@@ -4230,6 +4362,14 @@ var calldMethods = (client , baseUrl ) => ({
|
|
|
4230
4362
|
getMeetingParticipantsAsUser: async (meetingUuid ) =>
|
|
4231
4363
|
client.get(`${baseUrl}/users/me/meetings/${meetingUuid}/participants`),
|
|
4232
4364
|
|
|
4365
|
+
banMeetingParticipant: (meetingUuid , participantUuid ) =>
|
|
4366
|
+
client.delete(
|
|
4367
|
+
`${baseUrl}/users/me/meetings/${meetingUuid}/participants/${participantUuid}`,
|
|
4368
|
+
null,
|
|
4369
|
+
null,
|
|
4370
|
+
ApiRequester.successResponseParser,
|
|
4371
|
+
),
|
|
4372
|
+
|
|
4233
4373
|
listTrunks: () => client.get(`${baseUrl}/trunks`),
|
|
4234
4374
|
|
|
4235
4375
|
mute: (callId ) =>
|