@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.
Files changed (135) hide show
  1. package/README.md +1 -1
  2. package/dist/wazo-sdk.js +2 -2
  3. package/esm/__tests__/api-client.test.js +148 -2
  4. package/esm/__tests__/web-rtc-client.test.js +303 -26
  5. package/esm/api/calld.js +14 -0
  6. package/esm/api/confd.js +134 -2
  7. package/esm/api/ctid-ng.js +6 -0
  8. package/esm/api-client.js +148 -2
  9. package/esm/checker/Checker.js +212 -26
  10. package/esm/checker/checks/aor.js +148 -2
  11. package/esm/checker/checks/api.js +148 -2
  12. package/esm/checker/checks/index.js +212 -26
  13. package/esm/checker/checks/wazo-websocket.js +2 -0
  14. package/esm/checker/checks/webrtc-transport.js +210 -26
  15. package/esm/checker/checks/webrtc.js +210 -26
  16. package/esm/domain/AdHocAPIConference.js +148 -2
  17. package/esm/domain/Call.js +6 -0
  18. package/esm/domain/CallSession.js +1 -1
  19. package/esm/domain/Features.js +148 -2
  20. package/esm/domain/Meeting.js +18 -0
  21. package/esm/domain/MeetingAuthorization.js +70 -0
  22. package/esm/domain/Phone/CTIPhone.js +149 -3
  23. package/esm/domain/Phone/WebRTCPhone.js +3 -3
  24. package/esm/domain/__tests__/Call.test.js +6 -0
  25. package/esm/domain/__tests__/CallSession.test.js +1 -1
  26. package/esm/domain/__tests__/IndirectTransfer.test.js +1 -1
  27. package/esm/domain/__tests__/Meeting.test.js +87 -1
  28. package/esm/domain/__tests__/MeetingAuthorization.test.js +109 -0
  29. package/esm/domain/__tests__/Room.test.js +1 -1
  30. package/esm/index.js +258 -32
  31. package/esm/lib/WazoSessionDescriptionHandler.js +22 -1
  32. package/esm/service/CallApi.js +148 -2
  33. package/esm/service/getApiClient.js +148 -2
  34. package/esm/simple/Auth.js +258 -32
  35. package/esm/simple/Configuration.js +258 -32
  36. package/esm/simple/Directory.js +148 -2
  37. package/esm/simple/Phone.js +258 -32
  38. package/esm/simple/Websocket.js +3 -0
  39. package/esm/simple/index.js +258 -32
  40. package/esm/simple/room/LocalParticipant.js +258 -32
  41. package/esm/simple/room/Participant.js +258 -32
  42. package/esm/simple/room/RemoteParticipant.js +258 -32
  43. package/esm/simple/room/Room.js +258 -32
  44. package/esm/simple/room/SipRoom.js +258 -32
  45. package/esm/simple/room/Stream.js +258 -32
  46. package/esm/simple/room/__tests__/Participant.test.js +14747 -0
  47. package/esm/simple/room/__tests__/RemoteParticipant.test.js +258 -32
  48. package/esm/simple/utils.js +258 -32
  49. package/esm/utils/__tests__/object.test.js +57 -0
  50. package/esm/utils/__tests__/sdp.test.js +50 -0
  51. package/esm/utils/__tests__/string.test.js +30 -0
  52. package/esm/utils/object.js +24 -0
  53. package/esm/utils/sdp.js +19 -1
  54. package/esm/utils/string.js +10 -0
  55. package/esm/web-rtc-client.js +210 -26
  56. package/esm/websocket-client.js +3 -1
  57. package/lib/__tests__/api-client.test.js +148 -2
  58. package/lib/__tests__/web-rtc-client.test.js +303 -26
  59. package/lib/api/calld.js +14 -0
  60. package/lib/api/confd.js +134 -2
  61. package/lib/api/ctid-ng.js +6 -0
  62. package/lib/api-client.js +148 -2
  63. package/lib/checker/Checker.js +212 -26
  64. package/lib/checker/checks/aor.js +148 -2
  65. package/lib/checker/checks/api.js +148 -2
  66. package/lib/checker/checks/index.js +212 -26
  67. package/lib/checker/checks/wazo-websocket.js +2 -0
  68. package/lib/checker/checks/webrtc-transport.js +210 -26
  69. package/lib/checker/checks/webrtc.js +210 -26
  70. package/lib/domain/AdHocAPIConference.js +148 -2
  71. package/lib/domain/Call.js +6 -0
  72. package/lib/domain/CallSession.js +1 -1
  73. package/lib/domain/Features.js +148 -2
  74. package/lib/domain/Meeting.js +18 -0
  75. package/lib/domain/MeetingAuthorization.js +79 -0
  76. package/lib/domain/Phone/CTIPhone.js +149 -3
  77. package/lib/domain/Phone/WebRTCPhone.js +3 -3
  78. package/lib/domain/__tests__/Call.test.js +6 -0
  79. package/lib/domain/__tests__/CallSession.test.js +1 -1
  80. package/lib/domain/__tests__/IndirectTransfer.test.js +1 -1
  81. package/lib/domain/__tests__/Meeting.test.js +87 -1
  82. package/lib/domain/__tests__/MeetingAuthorization.test.js +111 -0
  83. package/lib/domain/__tests__/Room.test.js +1 -1
  84. package/lib/index.js +258 -32
  85. package/lib/lib/WazoSessionDescriptionHandler.js +22 -1
  86. package/lib/service/CallApi.js +148 -2
  87. package/lib/service/getApiClient.js +148 -2
  88. package/lib/simple/Auth.js +258 -32
  89. package/lib/simple/Configuration.js +258 -32
  90. package/lib/simple/Directory.js +148 -2
  91. package/lib/simple/Phone.js +258 -32
  92. package/lib/simple/Websocket.js +3 -0
  93. package/lib/simple/index.js +258 -32
  94. package/lib/simple/room/LocalParticipant.js +258 -32
  95. package/lib/simple/room/Participant.js +258 -32
  96. package/lib/simple/room/RemoteParticipant.js +258 -32
  97. package/lib/simple/room/Room.js +258 -32
  98. package/lib/simple/room/SipRoom.js +258 -32
  99. package/lib/simple/room/Stream.js +258 -32
  100. package/lib/simple/room/__tests__/Participant.test.js +14757 -0
  101. package/lib/simple/room/__tests__/RemoteParticipant.test.js +258 -32
  102. package/lib/simple/utils.js +258 -32
  103. package/lib/utils/__tests__/object.test.js +59 -0
  104. package/lib/utils/__tests__/sdp.test.js +50 -0
  105. package/lib/utils/__tests__/string.test.js +32 -0
  106. package/lib/utils/object.js +28 -0
  107. package/lib/utils/sdp.js +19 -0
  108. package/lib/utils/string.js +14 -0
  109. package/lib/web-rtc-client.js +210 -26
  110. package/lib/websocket-client.js +3 -0
  111. package/package.json +2 -2
  112. package/src/__tests__/web-rtc-client.test.js +93 -0
  113. package/src/api/calld.js +8 -0
  114. package/src/api/confd.js +43 -2
  115. package/src/domain/Call.js +6 -0
  116. package/src/domain/CallSession.js +1 -1
  117. package/src/domain/Meeting.js +20 -0
  118. package/src/domain/MeetingAuthorization.js +67 -0
  119. package/src/domain/Phone/WebRTCPhone.js +2 -2
  120. package/src/domain/__tests__/Meeting.test.js +70 -1
  121. package/src/domain/__tests__/MeetingAuthorization.test.js +58 -0
  122. package/src/lib/WazoSessionDescriptionHandler.js +5 -2
  123. package/src/simple/room/Participant.js +40 -0
  124. package/src/simple/room/Room.js +2 -2
  125. package/src/simple/room/SipRoom.js +1 -1
  126. package/src/simple/room/__tests__/Participant.test.js +81 -0
  127. package/src/types/WebSocketMessage.js +7 -1
  128. package/src/utils/__tests__/object.test.js +35 -0
  129. package/src/utils/__tests__/sdp.test.js +33 -1
  130. package/src/utils/__tests__/string.test.js +23 -0
  131. package/src/utils/object.js +15 -0
  132. package/src/utils/sdp.js +18 -0
  133. package/src/utils/string.js +8 -0
  134. package/src/web-rtc-client.js +40 -23
  135. package/src/websocket-client.js +2 -0
@@ -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: false,
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: (name , persistent ) =>
3412
- client.post(`${baseUrl}/users/me/meetings`, { name, persistent }).then(Meeting.parse),
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 description;
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: id,
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
- // $FlowFixMe
7521
- return navigator.mediaDevices.getUserMedia({ audio: { deviceId: { exact: id } } }).then(async stream => {
7522
- const audioTrack = stream.getAudioTracks()[0];
7523
- const sender = pc && pc.getSenders().find(s => audioTrack && s && s.track && s.track.kind === audioTrack.kind);
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
- if (sender) {
7526
- if (sender.track) {
7527
- audioTrack.enabled = sender.track.enabled;
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
- return stream;
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 update the local video value
7554
- if (this.video) {
7555
- this.video = {
7556
- deviceId: {
7557
- exact: id,
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 received, so no need to broadcast, hence the input false arg
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
 
@@ -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
  });