@wazo/sdk 0.38.7 → 0.38.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/wazo-sdk.js +2 -2
- package/esm/__tests__/api-client.test.js +142 -2
- package/esm/__tests__/web-rtc-client.test.js +227 -27
- package/esm/api/calld.js +8 -0
- package/esm/api/confd.js +134 -2
- package/esm/api-client.js +142 -2
- package/esm/checker/Checker.js +183 -24
- package/esm/checker/checks/aor.js +142 -2
- package/esm/checker/checks/api.js +142 -2
- package/esm/checker/checks/index.js +183 -24
- package/esm/checker/checks/wazo-websocket.js +2 -0
- package/esm/checker/checks/webrtc-transport.js +181 -24
- package/esm/checker/checks/webrtc.js +181 -24
- package/esm/domain/AdHocAPIConference.js +142 -2
- package/esm/domain/Features.js +142 -2
- package/esm/domain/Meeting.js +18 -0
- package/esm/domain/MeetingAuthorization.js +70 -0
- package/esm/domain/Phone/CTIPhone.js +142 -2
- package/esm/domain/__tests__/Meeting.test.js +87 -1
- package/esm/domain/__tests__/MeetingAuthorization.test.js +109 -0
- package/esm/index.js +226 -27
- package/esm/service/CallApi.js +142 -2
- package/esm/service/getApiClient.js +142 -2
- package/esm/simple/Auth.js +226 -27
- package/esm/simple/Configuration.js +226 -27
- package/esm/simple/Directory.js +142 -2
- package/esm/simple/Phone.js +226 -27
- package/esm/simple/Websocket.js +3 -0
- package/esm/simple/index.js +226 -27
- package/esm/simple/room/LocalParticipant.js +226 -27
- package/esm/simple/room/Participant.js +226 -27
- package/esm/simple/room/RemoteParticipant.js +226 -27
- package/esm/simple/room/Room.js +226 -27
- package/esm/simple/room/SipRoom.js +226 -27
- package/esm/simple/room/Stream.js +226 -27
- package/esm/simple/room/__tests__/Participant.test.js +14747 -0
- package/esm/simple/room/__tests__/RemoteParticipant.test.js +226 -27
- package/esm/simple/utils.js +226 -27
- package/esm/utils/__tests__/object.test.js +57 -0
- package/esm/utils/__tests__/string.test.js +30 -0
- package/esm/utils/object.js +24 -0
- package/esm/utils/string.js +10 -0
- package/esm/web-rtc-client.js +181 -24
- package/esm/websocket-client.js +3 -1
- package/lib/__tests__/api-client.test.js +142 -2
- package/lib/__tests__/web-rtc-client.test.js +227 -27
- package/lib/api/calld.js +8 -0
- package/lib/api/confd.js +134 -2
- package/lib/api-client.js +142 -2
- package/lib/checker/Checker.js +183 -24
- package/lib/checker/checks/aor.js +142 -2
- package/lib/checker/checks/api.js +142 -2
- package/lib/checker/checks/index.js +183 -24
- package/lib/checker/checks/wazo-websocket.js +2 -0
- package/lib/checker/checks/webrtc-transport.js +181 -24
- package/lib/checker/checks/webrtc.js +181 -24
- package/lib/domain/AdHocAPIConference.js +142 -2
- package/lib/domain/Features.js +142 -2
- package/lib/domain/Meeting.js +18 -0
- package/lib/domain/MeetingAuthorization.js +79 -0
- package/lib/domain/Phone/CTIPhone.js +142 -2
- package/lib/domain/__tests__/Meeting.test.js +87 -1
- package/lib/domain/__tests__/MeetingAuthorization.test.js +111 -0
- package/lib/index.js +226 -27
- package/lib/service/CallApi.js +142 -2
- package/lib/service/getApiClient.js +142 -2
- package/lib/simple/Auth.js +226 -27
- package/lib/simple/Configuration.js +226 -27
- package/lib/simple/Directory.js +142 -2
- package/lib/simple/Phone.js +226 -27
- package/lib/simple/Websocket.js +3 -0
- package/lib/simple/index.js +226 -27
- package/lib/simple/room/LocalParticipant.js +226 -27
- package/lib/simple/room/Participant.js +226 -27
- package/lib/simple/room/RemoteParticipant.js +226 -27
- package/lib/simple/room/Room.js +226 -27
- package/lib/simple/room/SipRoom.js +226 -27
- package/lib/simple/room/Stream.js +226 -27
- package/lib/simple/room/__tests__/Participant.test.js +14757 -0
- package/lib/simple/room/__tests__/RemoteParticipant.test.js +226 -27
- package/lib/simple/utils.js +226 -27
- package/lib/utils/__tests__/object.test.js +59 -0
- package/lib/utils/__tests__/string.test.js +32 -0
- package/lib/utils/object.js +28 -0
- package/lib/utils/string.js +14 -0
- package/lib/web-rtc-client.js +181 -24
- package/lib/websocket-client.js +3 -0
- package/package.json +2 -2
- package/src/__tests__/web-rtc-client.test.js +46 -3
- package/src/api/calld.js +8 -0
- package/src/api/confd.js +43 -2
- package/src/domain/Meeting.js +20 -0
- package/src/domain/MeetingAuthorization.js +67 -0
- package/src/domain/__tests__/Meeting.test.js +70 -1
- package/src/domain/__tests__/MeetingAuthorization.test.js +58 -0
- package/src/simple/room/Participant.js +40 -0
- package/src/simple/room/Room.js +2 -2
- package/src/simple/room/SipRoom.js +1 -1
- package/src/simple/room/__tests__/Participant.test.js +81 -0
- package/src/types/WebSocketMessage.js +7 -1
- package/src/utils/__tests__/object.test.js +35 -0
- package/src/utils/__tests__/string.test.js +23 -0
- package/src/utils/object.js +15 -0
- package/src/utils/string.js +8 -0
- package/src/web-rtc-client.js +39 -22
- package/src/websocket-client.js +2 -0
|
@@ -3211,6 +3211,70 @@ class ExternalApp {
|
|
|
3211
3211
|
|
|
3212
3212
|
//
|
|
3213
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
|
+
|
|
3214
3278
|
|
|
3215
3279
|
|
|
3216
3280
|
|
|
@@ -3221,6 +3285,7 @@ class ExternalApp {
|
|
|
3221
3285
|
|
|
3222
3286
|
|
|
3223
3287
|
|
|
3288
|
+
|
|
3224
3289
|
|
|
3225
3290
|
|
|
3226
3291
|
class Meeting {
|
|
@@ -3235,6 +3300,8 @@ class Meeting {
|
|
|
3235
3300
|
|
|
3236
3301
|
|
|
3237
3302
|
|
|
3303
|
+
|
|
3304
|
+
|
|
3238
3305
|
|
|
3239
3306
|
static parse(plain ) {
|
|
3240
3307
|
return new Meeting({
|
|
@@ -3247,6 +3314,7 @@ class Meeting {
|
|
|
3247
3314
|
extension: plain.exten,
|
|
3248
3315
|
persistent: plain.persistent,
|
|
3249
3316
|
creationTime: moment__default['default'](plain.creation_time).toDate(),
|
|
3317
|
+
requireAuthorization: plain.require_authorization,
|
|
3250
3318
|
});
|
|
3251
3319
|
}
|
|
3252
3320
|
|
|
@@ -3271,6 +3339,7 @@ class Meeting {
|
|
|
3271
3339
|
extension,
|
|
3272
3340
|
persistent,
|
|
3273
3341
|
creationTime,
|
|
3342
|
+
requireAuthorization,
|
|
3274
3343
|
} = {}) {
|
|
3275
3344
|
this.guestSipAuthorization = guestSipAuthorization;
|
|
3276
3345
|
this.uri = uri;
|
|
@@ -3281,6 +3350,7 @@ class Meeting {
|
|
|
3281
3350
|
this.extension = extension;
|
|
3282
3351
|
this.persistent = persistent;
|
|
3283
3352
|
this.creationTime = creationTime;
|
|
3353
|
+
this.requireAuthorization = requireAuthorization;
|
|
3284
3354
|
|
|
3285
3355
|
// Useful to compare instead of instanceof with minified code
|
|
3286
3356
|
this.type = 'Meeting';
|
|
@@ -3291,8 +3361,32 @@ class Meeting {
|
|
|
3291
3361
|
const [username, secret] = atob(this.guestSipAuthorization).split(':');
|
|
3292
3362
|
return { username, secret };
|
|
3293
3363
|
}
|
|
3364
|
+
|
|
3294
3365
|
}
|
|
3295
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
|
+
|
|
3296
3390
|
/* */
|
|
3297
3391
|
|
|
3298
3392
|
var confdMethods = (client , baseUrl ) => ({
|
|
@@ -3361,8 +3455,18 @@ var confdMethods = (client , baseUrl ) => ({
|
|
|
3361
3455
|
getMyMeetings: () =>
|
|
3362
3456
|
client.get(`${baseUrl}/users/me/meetings`).then(response => Meeting.parseMany(response.items)),
|
|
3363
3457
|
|
|
3364
|
-
createMyMeeting: (
|
|
3365
|
-
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
|
+
),
|
|
3366
3470
|
|
|
3367
3471
|
deleteMyMeeting: (meetingUuid ) =>
|
|
3368
3472
|
client.delete(`${baseUrl}/users/me/meetings/${meetingUuid}`, null),
|
|
@@ -3370,8 +3474,36 @@ var confdMethods = (client , baseUrl ) => ({
|
|
|
3370
3474
|
getMeeting: (meetingUuid ) =>
|
|
3371
3475
|
client.get(`${baseUrl}/meetings/${meetingUuid}`, null).then(Meeting.parse),
|
|
3372
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
|
+
|
|
3373
3496
|
guestGetMeeting: (meetingUuid ) =>
|
|
3374
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
|
+
|
|
3375
3507
|
});
|
|
3376
3508
|
|
|
3377
3509
|
//
|
|
@@ -4810,6 +4942,14 @@ var calldMethods = (client , baseUrl ) => ({
|
|
|
4810
4942
|
getMeetingParticipantsAsUser: async (meetingUuid ) =>
|
|
4811
4943
|
client.get(`${baseUrl}/users/me/meetings/${meetingUuid}/participants`),
|
|
4812
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
|
+
|
|
4813
4953
|
listTrunks: () => client.get(`${baseUrl}/trunks`),
|
|
4814
4954
|
|
|
4815
4955
|
mute: (callId ) =>
|
|
@@ -6450,7 +6590,7 @@ class WebRTCClient extends Emitter {
|
|
|
6450
6590
|
});
|
|
6451
6591
|
}
|
|
6452
6592
|
|
|
6453
|
-
changeAudioInputDevice(id , session , force ) {
|
|
6593
|
+
async changeAudioInputDevice(id , session , force ) {
|
|
6454
6594
|
const currentId = this.getAudioDeviceId();
|
|
6455
6595
|
logger.info('setting audio input device', { id, currentId, session: !!session });
|
|
6456
6596
|
|
|
@@ -6458,33 +6598,50 @@ class WebRTCClient extends Emitter {
|
|
|
6458
6598
|
return null;
|
|
6459
6599
|
}
|
|
6460
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
|
+
|
|
6461
6619
|
// let's update the local audio value
|
|
6462
6620
|
if (this.audio) {
|
|
6463
6621
|
this.audio = {
|
|
6464
6622
|
deviceId: {
|
|
6465
|
-
exact:
|
|
6623
|
+
exact: deviceId,
|
|
6466
6624
|
},
|
|
6467
6625
|
};
|
|
6468
6626
|
}
|
|
6469
6627
|
|
|
6470
|
-
if (session) {
|
|
6628
|
+
if (session && navigator.mediaDevices) {
|
|
6471
6629
|
const sdh = session.sessionDescriptionHandler;
|
|
6472
6630
|
const pc = sdh.peerConnection;
|
|
6473
6631
|
|
|
6474
|
-
|
|
6475
|
-
|
|
6476
|
-
|
|
6477
|
-
|
|
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);
|
|
6478
6636
|
|
|
6479
|
-
|
|
6480
|
-
|
|
6481
|
-
|
|
6482
|
-
}
|
|
6483
|
-
sender.replaceTrack(audioTrack);
|
|
6637
|
+
if (sender) {
|
|
6638
|
+
if (sender.track) {
|
|
6639
|
+
audioTrack.enabled = sender.track.enabled;
|
|
6484
6640
|
}
|
|
6641
|
+
sender.replaceTrack(audioTrack);
|
|
6642
|
+
}
|
|
6485
6643
|
|
|
6486
|
-
|
|
6487
|
-
});
|
|
6644
|
+
return stream;
|
|
6488
6645
|
}
|
|
6489
6646
|
}
|
|
6490
6647
|
|
|
@@ -6504,14 +6661,14 @@ class WebRTCClient extends Emitter {
|
|
|
6504
6661
|
return null;
|
|
6505
6662
|
}
|
|
6506
6663
|
|
|
6507
|
-
// let's
|
|
6508
|
-
|
|
6509
|
-
|
|
6510
|
-
|
|
6511
|
-
|
|
6512
|
-
|
|
6513
|
-
}
|
|
6514
|
-
}
|
|
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
|
+
};
|
|
6515
6672
|
}
|
|
6516
6673
|
|
|
6517
6674
|
changeSessionVideoInputDevice(id , session ) {
|
|
@@ -7664,27 +7821,70 @@ describe('changeAudioInputDevice', () => {
|
|
|
7664
7821
|
});
|
|
7665
7822
|
});
|
|
7666
7823
|
|
|
7824
|
+
const devices = [
|
|
7825
|
+
{ deviceId: 'default', kind: 'audioinput', label: 'Default - Fake Microphone', groupId: 'fak3Gr0up3' },
|
|
7826
|
+
{ deviceId: 'fak3d3v1c3', kind: 'audioinput', label: 'Fake Microphone', groupId: 'fak3Gr0up3' },
|
|
7827
|
+
];
|
|
7828
|
+
const enumerateDevicesMock = jest.fn(async () => {
|
|
7829
|
+
return new Promise(resolve => {
|
|
7830
|
+
resolve(devices);
|
|
7831
|
+
});
|
|
7832
|
+
});
|
|
7833
|
+
|
|
7667
7834
|
Object.defineProperty(global.navigator, 'mediaDevices', {
|
|
7668
7835
|
value: {
|
|
7669
7836
|
getUserMedia: getUserMediaMock,
|
|
7837
|
+
enumerateDevices: enumerateDevicesMock,
|
|
7670
7838
|
},
|
|
7671
7839
|
});
|
|
7672
7840
|
|
|
7673
7841
|
it('should change the audio input track if the provided id is different', async () => {
|
|
7674
7842
|
client.setMediaConstraints(constraints);
|
|
7675
7843
|
expect(client.getAudioDeviceId()).toBe(defaultId);
|
|
7676
|
-
|
|
7844
|
+
const result = await client.changeAudioInputDevice(deviceId, session);
|
|
7845
|
+
expect(result).toBeTruthy();
|
|
7677
7846
|
});
|
|
7678
7847
|
|
|
7679
7848
|
it('should NOT change the audio input track if the provided id is the same', async () => {
|
|
7680
7849
|
client.setMediaConstraints(constraints);
|
|
7681
7850
|
expect(client.getAudioDeviceId()).toBe(defaultId);
|
|
7682
|
-
|
|
7851
|
+
const result = await client.changeAudioInputDevice(defaultId, session);
|
|
7852
|
+
expect(result).toBeFalsy();
|
|
7683
7853
|
});
|
|
7684
7854
|
|
|
7685
7855
|
it('should change the audio input track if the provided id is the same and force param is TRUE', async () => {
|
|
7686
7856
|
client.setMediaConstraints(constraints);
|
|
7687
7857
|
expect(client.getAudioDeviceId()).toBe(defaultId);
|
|
7688
|
-
|
|
7858
|
+
const result = await client.changeAudioInputDevice(defaultId, session, true);
|
|
7859
|
+
expect(result).toBeTruthy();
|
|
7860
|
+
});
|
|
7861
|
+
|
|
7862
|
+
describe('setVideoInputDevice', () => {
|
|
7863
|
+
it('should retain its original video values', () => {
|
|
7864
|
+
const video = { height: { min: 480, max: 720 }, width: { min: 640, max: 1280 } };
|
|
7865
|
+
|
|
7866
|
+
client.video = video;
|
|
7867
|
+
client.setVideoInputDevice(deviceId);
|
|
7868
|
+
expect(client.video).toEqual({ ...video, deviceId: { exact: deviceId } });
|
|
7869
|
+
});
|
|
7870
|
+
|
|
7871
|
+
it('should set deviceId when video\'s original value is true', () => {
|
|
7872
|
+
client.video = true;
|
|
7873
|
+
client.setVideoInputDevice(deviceId);
|
|
7874
|
+
expect(client.video).toEqual({ deviceId: { exact: deviceId } });
|
|
7875
|
+
});
|
|
7876
|
+
|
|
7877
|
+
it('should set deviceId when video\'s original value is not set', () => {
|
|
7878
|
+
client.video = undefined;
|
|
7879
|
+
client.setVideoInputDevice(deviceId);
|
|
7880
|
+
expect(client.video).toEqual({ deviceId: { exact: deviceId } });
|
|
7881
|
+
});
|
|
7882
|
+
|
|
7883
|
+
it('should NOT set deviceId when its value does not change', () => {
|
|
7884
|
+
client.video = { deviceId: { exact: deviceId } };
|
|
7885
|
+
const result = client.setVideoInputDevice(deviceId);
|
|
7886
|
+
expect(result).toEqual(null);
|
|
7887
|
+
expect(client.video).toEqual({ deviceId: { exact: deviceId } });
|
|
7888
|
+
});
|
|
7689
7889
|
});
|
|
7690
7890
|
});
|
package/lib/api/calld.js
CHANGED
|
@@ -1401,6 +1401,14 @@ var calld = (client , baseUrl ) => ({
|
|
|
1401
1401
|
getMeetingParticipantsAsUser: async (meetingUuid ) =>
|
|
1402
1402
|
client.get(`${baseUrl}/users/me/meetings/${meetingUuid}/participants`),
|
|
1403
1403
|
|
|
1404
|
+
banMeetingParticipant: (meetingUuid , participantUuid ) =>
|
|
1405
|
+
client.delete(
|
|
1406
|
+
`${baseUrl}/users/me/meetings/${meetingUuid}/participants/${participantUuid}`,
|
|
1407
|
+
null,
|
|
1408
|
+
null,
|
|
1409
|
+
ApiRequester.successResponseParser,
|
|
1410
|
+
),
|
|
1411
|
+
|
|
1404
1412
|
listTrunks: () => client.get(`${baseUrl}/trunks`),
|
|
1405
1413
|
|
|
1406
1414
|
mute: (callId ) =>
|
package/lib/api/confd.js
CHANGED
|
@@ -1292,6 +1292,70 @@ class ExternalApp {
|
|
|
1292
1292
|
|
|
1293
1293
|
//
|
|
1294
1294
|
|
|
1295
|
+
class MeetingAuthorization {
|
|
1296
|
+
|
|
1297
|
+
|
|
1298
|
+
|
|
1299
|
+
|
|
1300
|
+
|
|
1301
|
+
|
|
1302
|
+
constructor({
|
|
1303
|
+
meetingUuid,
|
|
1304
|
+
uuid,
|
|
1305
|
+
userUuid,
|
|
1306
|
+
userName,
|
|
1307
|
+
} = {}) {
|
|
1308
|
+
this.meetingUuid = meetingUuid;
|
|
1309
|
+
this.uuid = uuid;
|
|
1310
|
+
this.userUuid = userUuid;
|
|
1311
|
+
this.userName = userName;
|
|
1312
|
+
}
|
|
1313
|
+
|
|
1314
|
+
setStatus(status ) {
|
|
1315
|
+
this.status = status;
|
|
1316
|
+
}
|
|
1317
|
+
|
|
1318
|
+
getStatus() {
|
|
1319
|
+
return this.status;
|
|
1320
|
+
}
|
|
1321
|
+
|
|
1322
|
+
static parse(plain ) {
|
|
1323
|
+
const {
|
|
1324
|
+
meeting_uuid: meetingUuid,
|
|
1325
|
+
uuid,
|
|
1326
|
+
guest_uuid: userUuid,
|
|
1327
|
+
guest_name: userName,
|
|
1328
|
+
} = plain;
|
|
1329
|
+
|
|
1330
|
+
return new MeetingAuthorization({
|
|
1331
|
+
meetingUuid,
|
|
1332
|
+
uuid,
|
|
1333
|
+
userUuid,
|
|
1334
|
+
userName,
|
|
1335
|
+
});
|
|
1336
|
+
}
|
|
1337
|
+
|
|
1338
|
+
static parseMany(items ) {
|
|
1339
|
+
if (!items) {
|
|
1340
|
+
return [];
|
|
1341
|
+
}
|
|
1342
|
+
return items.map(MeetingAuthorization.parse);
|
|
1343
|
+
}
|
|
1344
|
+
}
|
|
1345
|
+
|
|
1346
|
+
//
|
|
1347
|
+
|
|
1348
|
+
|
|
1349
|
+
|
|
1350
|
+
|
|
1351
|
+
|
|
1352
|
+
|
|
1353
|
+
|
|
1354
|
+
|
|
1355
|
+
|
|
1356
|
+
|
|
1357
|
+
|
|
1358
|
+
|
|
1295
1359
|
|
|
1296
1360
|
|
|
1297
1361
|
|
|
@@ -1302,6 +1366,7 @@ class ExternalApp {
|
|
|
1302
1366
|
|
|
1303
1367
|
|
|
1304
1368
|
|
|
1369
|
+
|
|
1305
1370
|
|
|
1306
1371
|
|
|
1307
1372
|
class Meeting {
|
|
@@ -1316,6 +1381,8 @@ class Meeting {
|
|
|
1316
1381
|
|
|
1317
1382
|
|
|
1318
1383
|
|
|
1384
|
+
|
|
1385
|
+
|
|
1319
1386
|
|
|
1320
1387
|
static parse(plain ) {
|
|
1321
1388
|
return new Meeting({
|
|
@@ -1328,6 +1395,7 @@ class Meeting {
|
|
|
1328
1395
|
extension: plain.exten,
|
|
1329
1396
|
persistent: plain.persistent,
|
|
1330
1397
|
creationTime: moment__default['default'](plain.creation_time).toDate(),
|
|
1398
|
+
requireAuthorization: plain.require_authorization,
|
|
1331
1399
|
});
|
|
1332
1400
|
}
|
|
1333
1401
|
|
|
@@ -1352,6 +1420,7 @@ class Meeting {
|
|
|
1352
1420
|
extension,
|
|
1353
1421
|
persistent,
|
|
1354
1422
|
creationTime,
|
|
1423
|
+
requireAuthorization,
|
|
1355
1424
|
} = {}) {
|
|
1356
1425
|
this.guestSipAuthorization = guestSipAuthorization;
|
|
1357
1426
|
this.uri = uri;
|
|
@@ -1362,6 +1431,7 @@ class Meeting {
|
|
|
1362
1431
|
this.extension = extension;
|
|
1363
1432
|
this.persistent = persistent;
|
|
1364
1433
|
this.creationTime = creationTime;
|
|
1434
|
+
this.requireAuthorization = requireAuthorization;
|
|
1365
1435
|
|
|
1366
1436
|
// Useful to compare instead of instanceof with minified code
|
|
1367
1437
|
this.type = 'Meeting';
|
|
@@ -1372,8 +1442,32 @@ class Meeting {
|
|
|
1372
1442
|
const [username, secret] = atob(this.guestSipAuthorization).split(':');
|
|
1373
1443
|
return { username, secret };
|
|
1374
1444
|
}
|
|
1445
|
+
|
|
1375
1446
|
}
|
|
1376
1447
|
|
|
1448
|
+
//
|
|
1449
|
+
|
|
1450
|
+
const camelToUnderscore = (key ) => {
|
|
1451
|
+
if (typeof key !== 'string') {
|
|
1452
|
+
throw new Error('Input is not a string');
|
|
1453
|
+
}
|
|
1454
|
+
return key.charAt(0).toLowerCase() + key.substring(1).replace(/([A-Z])/g, '_$1').toLowerCase();
|
|
1455
|
+
};
|
|
1456
|
+
|
|
1457
|
+
//
|
|
1458
|
+
|
|
1459
|
+
const convertKeysFromCamelToUnderscore = (args ) => {
|
|
1460
|
+
if (!args || typeof args !== 'object' || Array.isArray(args)) {
|
|
1461
|
+
throw new Error('Input is not an object');
|
|
1462
|
+
}
|
|
1463
|
+
|
|
1464
|
+
return Object.keys(args).reduce((acc, key) => {
|
|
1465
|
+
acc[camelToUnderscore(key)] = typeof args[key] === 'object' && !Array.isArray(args[key])
|
|
1466
|
+
? convertKeysFromCamelToUnderscore(args[key]) : args[key];
|
|
1467
|
+
return acc;
|
|
1468
|
+
}, {});
|
|
1469
|
+
};
|
|
1470
|
+
|
|
1377
1471
|
/* */
|
|
1378
1472
|
|
|
1379
1473
|
var confd = (client , baseUrl ) => ({
|
|
@@ -1442,8 +1536,18 @@ var confd = (client , baseUrl ) => ({
|
|
|
1442
1536
|
getMyMeetings: () =>
|
|
1443
1537
|
client.get(`${baseUrl}/users/me/meetings`).then(response => Meeting.parseMany(response.items)),
|
|
1444
1538
|
|
|
1445
|
-
createMyMeeting: (
|
|
1446
|
-
client
|
|
1539
|
+
createMyMeeting: (args ) =>
|
|
1540
|
+
client
|
|
1541
|
+
.post(`${baseUrl}/users/me/meetings`, convertKeysFromCamelToUnderscore(args))
|
|
1542
|
+
.then(Meeting.parse),
|
|
1543
|
+
|
|
1544
|
+
updateMyMeeting: (meetingUuid , data ) =>
|
|
1545
|
+
client.put(
|
|
1546
|
+
`${baseUrl}/users/me/meetings/${meetingUuid}`,
|
|
1547
|
+
convertKeysFromCamelToUnderscore(data),
|
|
1548
|
+
null,
|
|
1549
|
+
ApiRequester.successResponseParser,
|
|
1550
|
+
),
|
|
1447
1551
|
|
|
1448
1552
|
deleteMyMeeting: (meetingUuid ) =>
|
|
1449
1553
|
client.delete(`${baseUrl}/users/me/meetings/${meetingUuid}`, null),
|
|
@@ -1451,8 +1555,36 @@ var confd = (client , baseUrl ) => ({
|
|
|
1451
1555
|
getMeeting: (meetingUuid ) =>
|
|
1452
1556
|
client.get(`${baseUrl}/meetings/${meetingUuid}`, null).then(Meeting.parse),
|
|
1453
1557
|
|
|
1558
|
+
meetingAuthorizations: (meetingUuid ) =>
|
|
1559
|
+
client.get(`${baseUrl}/users/me/meetings/${meetingUuid}/authorizations`, null).then(MeetingAuthorization.parseMany),
|
|
1560
|
+
|
|
1561
|
+
meetingAuthorizationReject: (meetingUuid , authorizationUuid ) =>
|
|
1562
|
+
client.put(
|
|
1563
|
+
`${baseUrl}/users/me/meetings/${meetingUuid}/authorizations/${authorizationUuid}/reject`,
|
|
1564
|
+
{},
|
|
1565
|
+
null,
|
|
1566
|
+
ApiRequester.successResponseParser,
|
|
1567
|
+
),
|
|
1568
|
+
|
|
1569
|
+
meetingAuthorizationAccept: (meetingUuid , authorizationUuid ) =>
|
|
1570
|
+
client.put(
|
|
1571
|
+
`${baseUrl}/users/me/meetings/${meetingUuid}/authorizations/${authorizationUuid}/accept`,
|
|
1572
|
+
{},
|
|
1573
|
+
null,
|
|
1574
|
+
ApiRequester.successResponseParser,
|
|
1575
|
+
),
|
|
1576
|
+
|
|
1454
1577
|
guestGetMeeting: (meetingUuid ) =>
|
|
1455
1578
|
client.get(`${baseUrl}/guests/me/meetings/${meetingUuid}`, null).then(Meeting.parse),
|
|
1579
|
+
|
|
1580
|
+
guestAuthorizationRequest: (userUuid , meetingUuid , username ) =>
|
|
1581
|
+
client
|
|
1582
|
+
.post(`${baseUrl}/guests/${userUuid}/meetings/${meetingUuid}/authorizations`, { guest_name: username })
|
|
1583
|
+
.then(MeetingAuthorization.parse),
|
|
1584
|
+
|
|
1585
|
+
guestAuthorizationCheck: (userUuid , meetingUuid , authorizationUuid ) =>
|
|
1586
|
+
client.get(`${baseUrl}/guests/${userUuid}/meetings/${meetingUuid}/authorizations/${authorizationUuid}`, null),
|
|
1587
|
+
|
|
1456
1588
|
});
|
|
1457
1589
|
|
|
1458
1590
|
module.exports = confd;
|