@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.
Files changed (118) hide show
  1. package/dist/wazo-sdk.js +2 -2
  2. package/esm/__tests__/api-client.test.js +142 -2
  3. package/esm/__tests__/web-rtc-client.test.js +249 -28
  4. package/esm/api/calld.js +8 -0
  5. package/esm/api/confd.js +134 -2
  6. package/esm/api-client.js +142 -2
  7. package/esm/checker/Checker.js +205 -25
  8. package/esm/checker/checks/aor.js +142 -2
  9. package/esm/checker/checks/api.js +142 -2
  10. package/esm/checker/checks/index.js +205 -25
  11. package/esm/checker/checks/wazo-websocket.js +2 -0
  12. package/esm/checker/checks/webrtc-transport.js +203 -25
  13. package/esm/checker/checks/webrtc.js +203 -25
  14. package/esm/domain/AdHocAPIConference.js +142 -2
  15. package/esm/domain/Features.js +142 -2
  16. package/esm/domain/Meeting.js +18 -0
  17. package/esm/domain/MeetingAuthorization.js +70 -0
  18. package/esm/domain/Phone/CTIPhone.js +142 -2
  19. package/esm/domain/Phone/WebRTCPhone.js +1 -3
  20. package/esm/domain/__tests__/Meeting.test.js +87 -1
  21. package/esm/domain/__tests__/MeetingAuthorization.test.js +109 -0
  22. package/esm/index.js +249 -31
  23. package/esm/lib/WazoSessionDescriptionHandler.js +22 -1
  24. package/esm/service/CallApi.js +142 -2
  25. package/esm/service/getApiClient.js +142 -2
  26. package/esm/simple/Auth.js +249 -31
  27. package/esm/simple/Configuration.js +249 -31
  28. package/esm/simple/Directory.js +142 -2
  29. package/esm/simple/Phone.js +249 -31
  30. package/esm/simple/Websocket.js +3 -0
  31. package/esm/simple/index.js +249 -31
  32. package/esm/simple/room/LocalParticipant.js +249 -31
  33. package/esm/simple/room/Participant.js +249 -31
  34. package/esm/simple/room/RemoteParticipant.js +249 -31
  35. package/esm/simple/room/Room.js +249 -31
  36. package/esm/simple/room/SipRoom.js +249 -31
  37. package/esm/simple/room/Stream.js +249 -31
  38. package/esm/simple/room/__tests__/Participant.test.js +14745 -0
  39. package/esm/simple/room/__tests__/RemoteParticipant.test.js +249 -31
  40. package/esm/simple/utils.js +249 -31
  41. package/esm/utils/__tests__/object.test.js +57 -0
  42. package/esm/utils/__tests__/sdp.test.js +50 -0
  43. package/esm/utils/__tests__/string.test.js +30 -0
  44. package/esm/utils/object.js +24 -0
  45. package/esm/utils/sdp.js +19 -1
  46. package/esm/utils/string.js +10 -0
  47. package/esm/web-rtc-client.js +203 -25
  48. package/esm/websocket-client.js +3 -1
  49. package/lib/__tests__/api-client.test.js +142 -2
  50. package/lib/__tests__/web-rtc-client.test.js +249 -28
  51. package/lib/api/calld.js +8 -0
  52. package/lib/api/confd.js +134 -2
  53. package/lib/api-client.js +142 -2
  54. package/lib/checker/Checker.js +205 -25
  55. package/lib/checker/checks/aor.js +142 -2
  56. package/lib/checker/checks/api.js +142 -2
  57. package/lib/checker/checks/index.js +205 -25
  58. package/lib/checker/checks/wazo-websocket.js +2 -0
  59. package/lib/checker/checks/webrtc-transport.js +203 -25
  60. package/lib/checker/checks/webrtc.js +203 -25
  61. package/lib/domain/AdHocAPIConference.js +142 -2
  62. package/lib/domain/Features.js +142 -2
  63. package/lib/domain/Meeting.js +18 -0
  64. package/lib/domain/MeetingAuthorization.js +79 -0
  65. package/lib/domain/Phone/CTIPhone.js +142 -2
  66. package/lib/domain/Phone/WebRTCPhone.js +1 -3
  67. package/lib/domain/__tests__/Meeting.test.js +87 -1
  68. package/lib/domain/__tests__/MeetingAuthorization.test.js +111 -0
  69. package/lib/index.js +249 -31
  70. package/lib/lib/WazoSessionDescriptionHandler.js +22 -1
  71. package/lib/service/CallApi.js +142 -2
  72. package/lib/service/getApiClient.js +142 -2
  73. package/lib/simple/Auth.js +249 -31
  74. package/lib/simple/Configuration.js +249 -31
  75. package/lib/simple/Directory.js +142 -2
  76. package/lib/simple/Phone.js +249 -31
  77. package/lib/simple/Websocket.js +3 -0
  78. package/lib/simple/index.js +249 -31
  79. package/lib/simple/room/LocalParticipant.js +249 -31
  80. package/lib/simple/room/Participant.js +249 -31
  81. package/lib/simple/room/RemoteParticipant.js +249 -31
  82. package/lib/simple/room/Room.js +249 -31
  83. package/lib/simple/room/SipRoom.js +249 -31
  84. package/lib/simple/room/Stream.js +249 -31
  85. package/lib/simple/room/__tests__/Participant.test.js +14755 -0
  86. package/lib/simple/room/__tests__/RemoteParticipant.test.js +249 -31
  87. package/lib/simple/utils.js +249 -31
  88. package/lib/utils/__tests__/object.test.js +59 -0
  89. package/lib/utils/__tests__/sdp.test.js +50 -0
  90. package/lib/utils/__tests__/string.test.js +32 -0
  91. package/lib/utils/object.js +28 -0
  92. package/lib/utils/sdp.js +19 -0
  93. package/lib/utils/string.js +14 -0
  94. package/lib/web-rtc-client.js +203 -25
  95. package/lib/websocket-client.js +3 -0
  96. package/package.json +2 -2
  97. package/src/__tests__/web-rtc-client.test.js +46 -3
  98. package/src/api/calld.js +8 -0
  99. package/src/api/confd.js +43 -2
  100. package/src/domain/Meeting.js +20 -0
  101. package/src/domain/MeetingAuthorization.js +67 -0
  102. package/src/domain/Phone/WebRTCPhone.js +1 -3
  103. package/src/domain/__tests__/Meeting.test.js +70 -1
  104. package/src/domain/__tests__/MeetingAuthorization.test.js +58 -0
  105. package/src/lib/WazoSessionDescriptionHandler.js +5 -2
  106. package/src/simple/room/Participant.js +40 -0
  107. package/src/simple/room/Room.js +2 -2
  108. package/src/simple/room/SipRoom.js +1 -1
  109. package/src/simple/room/__tests__/Participant.test.js +81 -0
  110. package/src/types/WebSocketMessage.js +7 -1
  111. package/src/utils/__tests__/object.test.js +35 -0
  112. package/src/utils/__tests__/sdp.test.js +33 -1
  113. package/src/utils/__tests__/string.test.js +23 -0
  114. package/src/utils/object.js +15 -0
  115. package/src/utils/sdp.js +18 -0
  116. package/src/utils/string.js +8 -0
  117. package/src/web-rtc-client.js +39 -22
  118. package/src/websocket-client.js +2 -0
@@ -3254,6 +3254,70 @@ class ExternalApp {
3254
3254
 
3255
3255
  //
3256
3256
 
3257
+ class MeetingAuthorization {
3258
+
3259
+
3260
+
3261
+
3262
+
3263
+
3264
+ constructor({
3265
+ meetingUuid,
3266
+ uuid,
3267
+ userUuid,
3268
+ userName,
3269
+ } = {}) {
3270
+ this.meetingUuid = meetingUuid;
3271
+ this.uuid = uuid;
3272
+ this.userUuid = userUuid;
3273
+ this.userName = userName;
3274
+ }
3275
+
3276
+ setStatus(status ) {
3277
+ this.status = status;
3278
+ }
3279
+
3280
+ getStatus() {
3281
+ return this.status;
3282
+ }
3283
+
3284
+ static parse(plain ) {
3285
+ const {
3286
+ meeting_uuid: meetingUuid,
3287
+ uuid,
3288
+ guest_uuid: userUuid,
3289
+ guest_name: userName,
3290
+ } = plain;
3291
+
3292
+ return new MeetingAuthorization({
3293
+ meetingUuid,
3294
+ uuid,
3295
+ userUuid,
3296
+ userName,
3297
+ });
3298
+ }
3299
+
3300
+ static parseMany(items ) {
3301
+ if (!items) {
3302
+ return [];
3303
+ }
3304
+ return items.map(MeetingAuthorization.parse);
3305
+ }
3306
+ }
3307
+
3308
+ //
3309
+
3310
+
3311
+
3312
+
3313
+
3314
+
3315
+
3316
+
3317
+
3318
+
3319
+
3320
+
3257
3321
 
3258
3322
 
3259
3323
 
@@ -3264,6 +3328,7 @@ class ExternalApp {
3264
3328
 
3265
3329
 
3266
3330
 
3331
+
3267
3332
 
3268
3333
 
3269
3334
  class Meeting {
@@ -3278,6 +3343,8 @@ class Meeting {
3278
3343
 
3279
3344
 
3280
3345
 
3346
+
3347
+
3281
3348
 
3282
3349
  static parse(plain ) {
3283
3350
  return new Meeting({
@@ -3290,6 +3357,7 @@ class Meeting {
3290
3357
  extension: plain.exten,
3291
3358
  persistent: plain.persistent,
3292
3359
  creationTime: moment(plain.creation_time).toDate(),
3360
+ requireAuthorization: plain.require_authorization,
3293
3361
  });
3294
3362
  }
3295
3363
 
@@ -3314,6 +3382,7 @@ class Meeting {
3314
3382
  extension,
3315
3383
  persistent,
3316
3384
  creationTime,
3385
+ requireAuthorization,
3317
3386
  } = {}) {
3318
3387
  this.guestSipAuthorization = guestSipAuthorization;
3319
3388
  this.uri = uri;
@@ -3324,6 +3393,7 @@ class Meeting {
3324
3393
  this.extension = extension;
3325
3394
  this.persistent = persistent;
3326
3395
  this.creationTime = creationTime;
3396
+ this.requireAuthorization = requireAuthorization;
3327
3397
 
3328
3398
  // Useful to compare instead of instanceof with minified code
3329
3399
  this.type = 'Meeting';
@@ -3334,8 +3404,32 @@ class Meeting {
3334
3404
  const [username, secret] = atob(this.guestSipAuthorization).split(':');
3335
3405
  return { username, secret };
3336
3406
  }
3407
+
3337
3408
  }
3338
3409
 
3410
+ //
3411
+
3412
+ const camelToUnderscore = (key ) => {
3413
+ if (typeof key !== 'string') {
3414
+ throw new Error('Input is not a string');
3415
+ }
3416
+ return key.charAt(0).toLowerCase() + key.substring(1).replace(/([A-Z])/g, '_$1').toLowerCase();
3417
+ };
3418
+
3419
+ //
3420
+
3421
+ const convertKeysFromCamelToUnderscore = (args ) => {
3422
+ if (!args || typeof args !== 'object' || Array.isArray(args)) {
3423
+ throw new Error('Input is not an object');
3424
+ }
3425
+
3426
+ return Object.keys(args).reduce((acc, key) => {
3427
+ acc[camelToUnderscore(key)] = typeof args[key] === 'object' && !Array.isArray(args[key])
3428
+ ? convertKeysFromCamelToUnderscore(args[key]) : args[key];
3429
+ return acc;
3430
+ }, {});
3431
+ };
3432
+
3339
3433
  /* */
3340
3434
 
3341
3435
  var confdMethods = (client , baseUrl ) => ({
@@ -3404,8 +3498,18 @@ var confdMethods = (client , baseUrl ) => ({
3404
3498
  getMyMeetings: () =>
3405
3499
  client.get(`${baseUrl}/users/me/meetings`).then(response => Meeting.parseMany(response.items)),
3406
3500
 
3407
- createMyMeeting: (name , persistent ) =>
3408
- client.post(`${baseUrl}/users/me/meetings`, { name, persistent }).then(Meeting.parse),
3501
+ createMyMeeting: (args ) =>
3502
+ client
3503
+ .post(`${baseUrl}/users/me/meetings`, convertKeysFromCamelToUnderscore(args))
3504
+ .then(Meeting.parse),
3505
+
3506
+ updateMyMeeting: (meetingUuid , data ) =>
3507
+ client.put(
3508
+ `${baseUrl}/users/me/meetings/${meetingUuid}`,
3509
+ convertKeysFromCamelToUnderscore(data),
3510
+ null,
3511
+ ApiRequester.successResponseParser,
3512
+ ),
3409
3513
 
3410
3514
  deleteMyMeeting: (meetingUuid ) =>
3411
3515
  client.delete(`${baseUrl}/users/me/meetings/${meetingUuid}`, null),
@@ -3413,8 +3517,36 @@ var confdMethods = (client , baseUrl ) => ({
3413
3517
  getMeeting: (meetingUuid ) =>
3414
3518
  client.get(`${baseUrl}/meetings/${meetingUuid}`, null).then(Meeting.parse),
3415
3519
 
3520
+ meetingAuthorizations: (meetingUuid ) =>
3521
+ client.get(`${baseUrl}/users/me/meetings/${meetingUuid}/authorizations`, null).then(MeetingAuthorization.parseMany),
3522
+
3523
+ meetingAuthorizationReject: (meetingUuid , authorizationUuid ) =>
3524
+ client.put(
3525
+ `${baseUrl}/users/me/meetings/${meetingUuid}/authorizations/${authorizationUuid}/reject`,
3526
+ {},
3527
+ null,
3528
+ ApiRequester.successResponseParser,
3529
+ ),
3530
+
3531
+ meetingAuthorizationAccept: (meetingUuid , authorizationUuid ) =>
3532
+ client.put(
3533
+ `${baseUrl}/users/me/meetings/${meetingUuid}/authorizations/${authorizationUuid}/accept`,
3534
+ {},
3535
+ null,
3536
+ ApiRequester.successResponseParser,
3537
+ ),
3538
+
3416
3539
  guestGetMeeting: (meetingUuid ) =>
3417
3540
  client.get(`${baseUrl}/guests/me/meetings/${meetingUuid}`, null).then(Meeting.parse),
3541
+
3542
+ guestAuthorizationRequest: (userUuid , meetingUuid , username ) =>
3543
+ client
3544
+ .post(`${baseUrl}/guests/${userUuid}/meetings/${meetingUuid}/authorizations`, { guest_name: username })
3545
+ .then(MeetingAuthorization.parse),
3546
+
3547
+ guestAuthorizationCheck: (userUuid , meetingUuid , authorizationUuid ) =>
3548
+ client.get(`${baseUrl}/guests/${userUuid}/meetings/${meetingUuid}/authorizations/${authorizationUuid}`, null),
3549
+
3418
3550
  });
3419
3551
 
3420
3552
  //
@@ -5056,6 +5188,14 @@ var calldMethods = (client , baseUrl ) => ({
5056
5188
  getMeetingParticipantsAsUser: async (meetingUuid ) =>
5057
5189
  client.get(`${baseUrl}/users/me/meetings/${meetingUuid}/participants`),
5058
5190
 
5191
+ banMeetingParticipant: (meetingUuid , participantUuid ) =>
5192
+ client.delete(
5193
+ `${baseUrl}/users/me/meetings/${meetingUuid}/participants/${participantUuid}`,
5194
+ null,
5195
+ null,
5196
+ ApiRequester.successResponseParser,
5197
+ ),
5198
+
5059
5199
  listTrunks: () => client.get(`${baseUrl}/trunks`),
5060
5200
 
5061
5201
  mute: (callId ) =>
@@ -5903,6 +6043,24 @@ const fixSdp = (sdp , candidates , forcePort = true)
5903
6043
  return fixed;
5904
6044
  };
5905
6045
 
6046
+ const addIcesInAllBundles = (sdp ) => {
6047
+ const parsedSdp = sdpParser.parse(sdp);
6048
+
6049
+ const mediaWithCandidate = parsedSdp.media.find(media => !!media.candidates);
6050
+ if (!mediaWithCandidate) {
6051
+ return sdp;
6052
+ }
6053
+
6054
+ const { candidates } = mediaWithCandidate;
6055
+
6056
+ parsedSdp.media = parsedSdp.media.map(media => ({
6057
+ ...media,
6058
+ candidates: media.candidates || candidates,
6059
+ }));
6060
+
6061
+ return sdpParser.write(parsedSdp);
6062
+ };
6063
+
5906
6064
  /* global RTCSessionDescriptionInit, navigator */
5907
6065
 
5908
6066
  const wazoLogger = IssueReporter$1 ? IssueReporter$1.loggerFor('webrtc-sdh') : console;
@@ -6032,7 +6190,10 @@ class WazoSessionDescriptionHandler extends SessionDescriptionHandler {
6032
6190
 
6033
6191
  // Check if we got ICEs
6034
6192
  if (sdp.indexOf('a=candidate') !== -1) {
6035
- return description;
6193
+ return {
6194
+ type: description.type,
6195
+ sdp: addIcesInAllBundles(sdp),
6196
+ };
6036
6197
  }
6037
6198
 
6038
6199
  wazoLogger.info('No ICE candidates found in SDP, fixing it with gathered ices', this.gatheredCandidates);
@@ -7492,7 +7653,7 @@ class WebRTCClient extends Emitter {
7492
7653
  });
7493
7654
  }
7494
7655
 
7495
- changeAudioInputDevice(id , session , force ) {
7656
+ async changeAudioInputDevice(id , session , force ) {
7496
7657
  const currentId = this.getAudioDeviceId();
7497
7658
  logger$9.info('setting audio input device', { id, currentId, session: !!session });
7498
7659
 
@@ -7500,33 +7661,50 @@ class WebRTCClient extends Emitter {
7500
7661
  return null;
7501
7662
  }
7502
7663
 
7664
+ // in order to handle an audio track change for default devices
7665
+ // we need the actual id of the device (not 'default')
7666
+ let deviceId = id;
7667
+ if (id === 'default' && navigator.mediaDevices) {
7668
+ const devices = await navigator.mediaDevices.enumerateDevices();
7669
+ const defaultDevice = devices.find(device => device.deviceId === 'default');
7670
+ if (defaultDevice) {
7671
+ const deviceLabel = defaultDevice.label.replace('Default - ', '');
7672
+ const targetDevice = devices.find(device => device.label === deviceLabel);
7673
+ if (targetDevice) {
7674
+ deviceId = targetDevice.deviceId;
7675
+ if (!force && deviceId === currentId) {
7676
+ return null;
7677
+ }
7678
+ }
7679
+ }
7680
+ }
7681
+
7503
7682
  // let's update the local audio value
7504
7683
  if (this.audio) {
7505
7684
  this.audio = {
7506
7685
  deviceId: {
7507
- exact: id,
7686
+ exact: deviceId,
7508
7687
  },
7509
7688
  };
7510
7689
  }
7511
7690
 
7512
- if (session) {
7691
+ if (session && navigator.mediaDevices) {
7513
7692
  const sdh = session.sessionDescriptionHandler;
7514
7693
  const pc = sdh.peerConnection;
7515
7694
 
7516
- // $FlowFixMe
7517
- return navigator.mediaDevices.getUserMedia({ audio: { deviceId: { exact: id } } }).then(async stream => {
7518
- const audioTrack = stream.getAudioTracks()[0];
7519
- const sender = pc && pc.getSenders().find(s => audioTrack && s && s.track && s.track.kind === audioTrack.kind);
7695
+ const constraints = { audio: { deviceId: { exact: deviceId } } };
7696
+ const stream = await navigator.mediaDevices.getUserMedia(constraints);
7697
+ const audioTrack = stream.getAudioTracks()[0];
7698
+ const sender = pc && pc.getSenders().find(s => audioTrack && s && s.track && s.track.kind === audioTrack.kind);
7520
7699
 
7521
- if (sender) {
7522
- if (sender.track) {
7523
- audioTrack.enabled = sender.track.enabled;
7524
- }
7525
- sender.replaceTrack(audioTrack);
7700
+ if (sender) {
7701
+ if (sender.track) {
7702
+ audioTrack.enabled = sender.track.enabled;
7526
7703
  }
7704
+ sender.replaceTrack(audioTrack);
7705
+ }
7527
7706
 
7528
- return stream;
7529
- });
7707
+ return stream;
7530
7708
  }
7531
7709
  }
7532
7710
 
@@ -7546,14 +7724,14 @@ class WebRTCClient extends Emitter {
7546
7724
  return null;
7547
7725
  }
7548
7726
 
7549
- // let's update the local video value
7550
- if (this.video) {
7551
- this.video = {
7552
- deviceId: {
7553
- exact: id,
7554
- },
7555
- };
7556
- }
7727
+ // let's make sure we don't lose other video constraints settings -- width, height, frameRate...
7728
+ const videoObject = typeof this.video === 'object' ? this.video : {};
7729
+ this.video = {
7730
+ ...videoObject,
7731
+ deviceId: {
7732
+ exact: id,
7733
+ },
7734
+ };
7557
7735
  }
7558
7736
 
7559
7737
  changeSessionVideoInputDevice(id , session ) {
@@ -9155,9 +9333,7 @@ class WebRTCPhone extends Emitter {
9155
9333
 
9156
9334
  try {
9157
9335
  if (this.currentScreenShare.stream) {
9158
- this.currentScreenShare.stream.getTracks()
9159
- .filter(track => track.kind === 'video')
9160
- .forEach(track => track.stop());
9336
+ this.currentScreenShare.stream.getTracks().forEach(track => track.stop());
9161
9337
  }
9162
9338
 
9163
9339
  if (restoreLocalStream) {
@@ -10831,6 +11007,7 @@ const AGENT_UNPAUSED = 'agent_unpaused';
10831
11007
  const CONFERENCE_ADHOC_PARTICIPANT_LEFT = 'conference_adhoc_participant_left';
10832
11008
  const CONFERENCE_ADHOC_DELETED = 'conference_adhoc_deleted';
10833
11009
  const MEETING_USER_PROGRESS = 'meeting_user_progress';
11010
+ const MEETING_USER_GUEST_AUTHORIZATION_CREATED = 'meeting_user_guest_authorization_created';
10834
11011
 
10835
11012
  const BLACKLIST_EVENTS = [
10836
11013
  CHAT_MESSAGE_SENT,
@@ -11182,6 +11359,7 @@ WebSocketClient.eventLists = [
11182
11359
  CONFERENCE_ADHOC_PARTICIPANT_LEFT,
11183
11360
  CONFERENCE_ADHOC_DELETED,
11184
11361
  MEETING_USER_PROGRESS,
11362
+ MEETING_USER_GUEST_AUTHORIZATION_CREATED,
11185
11363
  ];
11186
11364
 
11187
11365
  var WebSocketClient$1 = /*#__PURE__*/Object.freeze({
@@ -11253,6 +11431,7 @@ var WebSocketClient$1 = /*#__PURE__*/Object.freeze({
11253
11431
  CONFERENCE_ADHOC_PARTICIPANT_LEFT: CONFERENCE_ADHOC_PARTICIPANT_LEFT,
11254
11432
  CONFERENCE_ADHOC_DELETED: CONFERENCE_ADHOC_DELETED,
11255
11433
  MEETING_USER_PROGRESS: MEETING_USER_PROGRESS,
11434
+ MEETING_USER_GUEST_AUTHORIZATION_CREATED: MEETING_USER_GUEST_AUTHORIZATION_CREATED,
11256
11435
  HEARTBEAT_ENGINE_VERSION: HEARTBEAT_ENGINE_VERSION,
11257
11436
  'default': WebSocketClient
11258
11437
  });
@@ -11357,6 +11536,7 @@ class Participant extends Emitter {
11357
11536
 
11358
11537
 
11359
11538
 
11539
+
11360
11540
 
11361
11541
 
11362
11542
 
@@ -11374,6 +11554,7 @@ class Participant extends Emitter {
11374
11554
 
11375
11555
 
11376
11556
 
11557
+
11377
11558
 
11378
11559
  /**
11379
11560
  * @param room Room The room where the participant is
@@ -11397,6 +11578,7 @@ class Participant extends Emitter {
11397
11578
  this.screensharing = false;
11398
11579
  this.isOnHold = false;
11399
11580
  this.extra = extra;
11581
+ this.banned = false;
11400
11582
 
11401
11583
  this.ON_UPDATED = 'participant/ON_UPDATED';
11402
11584
  this.ON_START_TALKING = 'participant/ON_START_TALKING';
@@ -11413,6 +11595,7 @@ class Participant extends Emitter {
11413
11595
  this.ON_EXTRA_CHANGE = 'participant/ON_EXTRA_CHANGE';
11414
11596
  this.ON_HOLD = 'participant/ON_HOLD';
11415
11597
  this.ON_RESUME = 'participant/ON_RESUME';
11598
+ this.ON_BAN = 'participant/ON_BAN';
11416
11599
  }
11417
11600
 
11418
11601
  triggerEvent(name , ...args ) {
@@ -11453,6 +11636,10 @@ class Participant extends Emitter {
11453
11636
  status.extra = this.extra;
11454
11637
  break;
11455
11638
  }
11639
+ case this.ON_BAN: {
11640
+ status.banned = true;
11641
+ break;
11642
+ }
11456
11643
  }
11457
11644
 
11458
11645
  if (broadcast) {
@@ -11555,6 +11742,11 @@ class Participant extends Emitter {
11555
11742
  this.triggerUpdate(this.ON_RESUME, broadcast);
11556
11743
  }
11557
11744
 
11745
+ onBan(broadcast = true) {
11746
+ this.banned = true;
11747
+ this.triggerUpdate(this.ON_BAN, broadcast);
11748
+ }
11749
+
11558
11750
  getStatus() {
11559
11751
  return {
11560
11752
  callId: this.callId,
@@ -11601,6 +11793,10 @@ class Participant extends Emitter {
11601
11793
  }
11602
11794
  }
11603
11795
 
11796
+ if (status.banned) {
11797
+ this.onBan(false);
11798
+ }
11799
+
11604
11800
  // Poor man's object comparison
11605
11801
  if (typeof status.extra !== 'undefined' && JSON.stringify(this.extra) !== JSON.stringify(status.extra)) {
11606
11802
  this.extra = { ...this.extra, ...status.extra };
@@ -11628,6 +11824,28 @@ class Participant extends Emitter {
11628
11824
  this.streams = streams;
11629
11825
  this.videoStreams = streams;
11630
11826
  }
11827
+
11828
+ async ban(apiRequestDelay = null) {
11829
+ const { meetingUuid } = this.room;
11830
+ if (!meetingUuid) {
11831
+ throw new Error('Attempting to ban a participant without a `meetingUuid`');
11832
+ }
11833
+
11834
+ // this notifies all that someone is being banned
11835
+ this.onBan(true);
11836
+
11837
+ // this allows to delay the actual ban, in order for the banned participant as well as others to react to the situation
11838
+ if (apiRequestDelay) {
11839
+ await this.delay(apiRequestDelay);
11840
+ }
11841
+
11842
+ // proceed with the actual kick
11843
+ return getApiClient().calld.banMeetingParticipant(meetingUuid, this.callId);
11844
+ }
11845
+
11846
+ async delay(ms ) {
11847
+ return new Promise(resolve => setTimeout(resolve, ms));
11848
+ }
11631
11849
  }
11632
11850
 
11633
11851
  //
@@ -11780,7 +11998,7 @@ class Room$1 extends Emitter {
11780
11998
  logger$3.info('connecting to room', { extension, audioOnly, room: !!room });
11781
11999
 
11782
12000
  if (!room) {
11783
- await Wazo.Phone.connect();
12001
+ await Wazo.Phone.connect({ media: constraints });
11784
12002
 
11785
12003
  const withCamera = constraints && !!constraints.video;
11786
12004
 
@@ -12225,7 +12443,7 @@ class Room$1 extends Emitter {
12225
12443
  const participant = this._getParticipantFromCallId(status.callId);
12226
12444
 
12227
12445
  if (participant) {
12228
- // we're received, so no need to broadcast, hence the input false arg
12446
+ // we're receiving, so no need to broadcast
12229
12447
  participant.updateStatus(status, false);
12230
12448
  }
12231
12449
  break;
@@ -12492,7 +12710,7 @@ class SipRoom extends Room$1 {
12492
12710
  logger$2.info('connecting to sip room', { extension, audioOnly, room: !!room });
12493
12711
 
12494
12712
  if (!room) {
12495
- await Wazo.Phone.connect();
12713
+ await Wazo.Phone.connect({ media: constraints });
12496
12714
 
12497
12715
  const withCamera = constraints && !!constraints.video;
12498
12716
 
@@ -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,6 +959,7 @@ 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
  var WebSocketClient$1 = /*#__PURE__*/Object.freeze({
@@ -1029,6 +1031,7 @@ var WebSocketClient$1 = /*#__PURE__*/Object.freeze({
1029
1031
  CONFERENCE_ADHOC_PARTICIPANT_LEFT: CONFERENCE_ADHOC_PARTICIPANT_LEFT,
1030
1032
  CONFERENCE_ADHOC_DELETED: CONFERENCE_ADHOC_DELETED,
1031
1033
  MEETING_USER_PROGRESS: MEETING_USER_PROGRESS,
1034
+ MEETING_USER_GUEST_AUTHORIZATION_CREATED: MEETING_USER_GUEST_AUTHORIZATION_CREATED,
1032
1035
  HEARTBEAT_ENGINE_VERSION: HEARTBEAT_ENGINE_VERSION,
1033
1036
  'default': WebSocketClient
1034
1037
  });