@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
@@ -3264,6 +3264,70 @@ class ExternalApp {
3264
3264
 
3265
3265
  //
3266
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
+
3267
3331
 
3268
3332
 
3269
3333
 
@@ -3274,6 +3338,7 @@ class ExternalApp {
3274
3338
 
3275
3339
 
3276
3340
 
3341
+
3277
3342
 
3278
3343
 
3279
3344
  class Meeting {
@@ -3288,6 +3353,8 @@ class Meeting {
3288
3353
 
3289
3354
 
3290
3355
 
3356
+
3357
+
3291
3358
 
3292
3359
  static parse(plain ) {
3293
3360
  return new Meeting({
@@ -3300,6 +3367,7 @@ class Meeting {
3300
3367
  extension: plain.exten,
3301
3368
  persistent: plain.persistent,
3302
3369
  creationTime: moment__default['default'](plain.creation_time).toDate(),
3370
+ requireAuthorization: plain.require_authorization,
3303
3371
  });
3304
3372
  }
3305
3373
 
@@ -3324,6 +3392,7 @@ class Meeting {
3324
3392
  extension,
3325
3393
  persistent,
3326
3394
  creationTime,
3395
+ requireAuthorization,
3327
3396
  } = {}) {
3328
3397
  this.guestSipAuthorization = guestSipAuthorization;
3329
3398
  this.uri = uri;
@@ -3334,6 +3403,7 @@ class Meeting {
3334
3403
  this.extension = extension;
3335
3404
  this.persistent = persistent;
3336
3405
  this.creationTime = creationTime;
3406
+ this.requireAuthorization = requireAuthorization;
3337
3407
 
3338
3408
  // Useful to compare instead of instanceof with minified code
3339
3409
  this.type = 'Meeting';
@@ -3344,8 +3414,32 @@ class Meeting {
3344
3414
  const [username, secret] = atob(this.guestSipAuthorization).split(':');
3345
3415
  return { username, secret };
3346
3416
  }
3417
+
3347
3418
  }
3348
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
+
3349
3443
  /* */
3350
3444
 
3351
3445
  var confdMethods = (client , baseUrl ) => ({
@@ -3414,8 +3508,18 @@ var confdMethods = (client , baseUrl ) => ({
3414
3508
  getMyMeetings: () =>
3415
3509
  client.get(`${baseUrl}/users/me/meetings`).then(response => Meeting.parseMany(response.items)),
3416
3510
 
3417
- createMyMeeting: (name , persistent ) =>
3418
- 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
+ ),
3419
3523
 
3420
3524
  deleteMyMeeting: (meetingUuid ) =>
3421
3525
  client.delete(`${baseUrl}/users/me/meetings/${meetingUuid}`, null),
@@ -3423,8 +3527,36 @@ var confdMethods = (client , baseUrl ) => ({
3423
3527
  getMeeting: (meetingUuid ) =>
3424
3528
  client.get(`${baseUrl}/meetings/${meetingUuid}`, null).then(Meeting.parse),
3425
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
+
3426
3549
  guestGetMeeting: (meetingUuid ) =>
3427
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
+
3428
3560
  });
3429
3561
 
3430
3562
  //
@@ -5066,6 +5198,14 @@ var calldMethods = (client , baseUrl ) => ({
5066
5198
  getMeetingParticipantsAsUser: async (meetingUuid ) =>
5067
5199
  client.get(`${baseUrl}/users/me/meetings/${meetingUuid}/participants`),
5068
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
+
5069
5209
  listTrunks: () => client.get(`${baseUrl}/trunks`),
5070
5210
 
5071
5211
  mute: (callId ) =>
@@ -5913,6 +6053,24 @@ const fixSdp = (sdp , candidates , forcePort = true)
5913
6053
  return fixed;
5914
6054
  };
5915
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
+
5916
6074
  /* global RTCSessionDescriptionInit, navigator */
5917
6075
 
5918
6076
  const wazoLogger = IssueReporter$1 ? IssueReporter$1.loggerFor('webrtc-sdh') : console;
@@ -6042,7 +6200,10 @@ class WazoSessionDescriptionHandler extends sessionDescriptionHandler.SessionDes
6042
6200
 
6043
6201
  // Check if we got ICEs
6044
6202
  if (sdp.indexOf('a=candidate') !== -1) {
6045
- return description;
6203
+ return {
6204
+ type: description.type,
6205
+ sdp: addIcesInAllBundles(sdp),
6206
+ };
6046
6207
  }
6047
6208
 
6048
6209
  wazoLogger.info('No ICE candidates found in SDP, fixing it with gathered ices', this.gatheredCandidates);
@@ -7502,7 +7663,7 @@ class WebRTCClient extends Emitter {
7502
7663
  });
7503
7664
  }
7504
7665
 
7505
- changeAudioInputDevice(id , session , force ) {
7666
+ async changeAudioInputDevice(id , session , force ) {
7506
7667
  const currentId = this.getAudioDeviceId();
7507
7668
  logger$9.info('setting audio input device', { id, currentId, session: !!session });
7508
7669
 
@@ -7510,33 +7671,50 @@ class WebRTCClient extends Emitter {
7510
7671
  return null;
7511
7672
  }
7512
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
+
7513
7692
  // let's update the local audio value
7514
7693
  if (this.audio) {
7515
7694
  this.audio = {
7516
7695
  deviceId: {
7517
- exact: id,
7696
+ exact: deviceId,
7518
7697
  },
7519
7698
  };
7520
7699
  }
7521
7700
 
7522
- if (session) {
7701
+ if (session && navigator.mediaDevices) {
7523
7702
  const sdh = session.sessionDescriptionHandler;
7524
7703
  const pc = sdh.peerConnection;
7525
7704
 
7526
- // $FlowFixMe
7527
- return navigator.mediaDevices.getUserMedia({ audio: { deviceId: { exact: id } } }).then(async stream => {
7528
- const audioTrack = stream.getAudioTracks()[0];
7529
- 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);
7530
7709
 
7531
- if (sender) {
7532
- if (sender.track) {
7533
- audioTrack.enabled = sender.track.enabled;
7534
- }
7535
- sender.replaceTrack(audioTrack);
7710
+ if (sender) {
7711
+ if (sender.track) {
7712
+ audioTrack.enabled = sender.track.enabled;
7536
7713
  }
7714
+ sender.replaceTrack(audioTrack);
7715
+ }
7537
7716
 
7538
- return stream;
7539
- });
7717
+ return stream;
7540
7718
  }
7541
7719
  }
7542
7720
 
@@ -7556,14 +7734,14 @@ class WebRTCClient extends Emitter {
7556
7734
  return null;
7557
7735
  }
7558
7736
 
7559
- // let's update the local video value
7560
- if (this.video) {
7561
- this.video = {
7562
- deviceId: {
7563
- exact: id,
7564
- },
7565
- };
7566
- }
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
+ };
7567
7745
  }
7568
7746
 
7569
7747
  changeSessionVideoInputDevice(id , session ) {
@@ -9165,9 +9343,7 @@ class WebRTCPhone extends Emitter {
9165
9343
 
9166
9344
  try {
9167
9345
  if (this.currentScreenShare.stream) {
9168
- this.currentScreenShare.stream.getTracks()
9169
- .filter(track => track.kind === 'video')
9170
- .forEach(track => track.stop());
9346
+ this.currentScreenShare.stream.getTracks().forEach(track => track.stop());
9171
9347
  }
9172
9348
 
9173
9349
  if (restoreLocalStream) {
@@ -10841,6 +11017,7 @@ const AGENT_UNPAUSED = 'agent_unpaused';
10841
11017
  const CONFERENCE_ADHOC_PARTICIPANT_LEFT = 'conference_adhoc_participant_left';
10842
11018
  const CONFERENCE_ADHOC_DELETED = 'conference_adhoc_deleted';
10843
11019
  const MEETING_USER_PROGRESS = 'meeting_user_progress';
11020
+ const MEETING_USER_GUEST_AUTHORIZATION_CREATED = 'meeting_user_guest_authorization_created';
10844
11021
 
10845
11022
  const BLACKLIST_EVENTS = [
10846
11023
  CHAT_MESSAGE_SENT,
@@ -11192,6 +11369,7 @@ WebSocketClient.eventLists = [
11192
11369
  CONFERENCE_ADHOC_PARTICIPANT_LEFT,
11193
11370
  CONFERENCE_ADHOC_DELETED,
11194
11371
  MEETING_USER_PROGRESS,
11372
+ MEETING_USER_GUEST_AUTHORIZATION_CREATED,
11195
11373
  ];
11196
11374
 
11197
11375
  var WebSocketClient$1 = /*#__PURE__*/Object.freeze({
@@ -11263,6 +11441,7 @@ var WebSocketClient$1 = /*#__PURE__*/Object.freeze({
11263
11441
  CONFERENCE_ADHOC_PARTICIPANT_LEFT: CONFERENCE_ADHOC_PARTICIPANT_LEFT,
11264
11442
  CONFERENCE_ADHOC_DELETED: CONFERENCE_ADHOC_DELETED,
11265
11443
  MEETING_USER_PROGRESS: MEETING_USER_PROGRESS,
11444
+ MEETING_USER_GUEST_AUTHORIZATION_CREATED: MEETING_USER_GUEST_AUTHORIZATION_CREATED,
11266
11445
  HEARTBEAT_ENGINE_VERSION: HEARTBEAT_ENGINE_VERSION,
11267
11446
  'default': WebSocketClient
11268
11447
  });
@@ -11367,6 +11546,7 @@ class Participant extends Emitter {
11367
11546
 
11368
11547
 
11369
11548
 
11549
+
11370
11550
 
11371
11551
 
11372
11552
 
@@ -11384,6 +11564,7 @@ class Participant extends Emitter {
11384
11564
 
11385
11565
 
11386
11566
 
11567
+
11387
11568
 
11388
11569
  /**
11389
11570
  * @param room Room The room where the participant is
@@ -11407,6 +11588,7 @@ class Participant extends Emitter {
11407
11588
  this.screensharing = false;
11408
11589
  this.isOnHold = false;
11409
11590
  this.extra = extra;
11591
+ this.banned = false;
11410
11592
 
11411
11593
  this.ON_UPDATED = 'participant/ON_UPDATED';
11412
11594
  this.ON_START_TALKING = 'participant/ON_START_TALKING';
@@ -11423,6 +11605,7 @@ class Participant extends Emitter {
11423
11605
  this.ON_EXTRA_CHANGE = 'participant/ON_EXTRA_CHANGE';
11424
11606
  this.ON_HOLD = 'participant/ON_HOLD';
11425
11607
  this.ON_RESUME = 'participant/ON_RESUME';
11608
+ this.ON_BAN = 'participant/ON_BAN';
11426
11609
  }
11427
11610
 
11428
11611
  triggerEvent(name , ...args ) {
@@ -11463,6 +11646,10 @@ class Participant extends Emitter {
11463
11646
  status.extra = this.extra;
11464
11647
  break;
11465
11648
  }
11649
+ case this.ON_BAN: {
11650
+ status.banned = true;
11651
+ break;
11652
+ }
11466
11653
  }
11467
11654
 
11468
11655
  if (broadcast) {
@@ -11565,6 +11752,11 @@ class Participant extends Emitter {
11565
11752
  this.triggerUpdate(this.ON_RESUME, broadcast);
11566
11753
  }
11567
11754
 
11755
+ onBan(broadcast = true) {
11756
+ this.banned = true;
11757
+ this.triggerUpdate(this.ON_BAN, broadcast);
11758
+ }
11759
+
11568
11760
  getStatus() {
11569
11761
  return {
11570
11762
  callId: this.callId,
@@ -11611,6 +11803,10 @@ class Participant extends Emitter {
11611
11803
  }
11612
11804
  }
11613
11805
 
11806
+ if (status.banned) {
11807
+ this.onBan(false);
11808
+ }
11809
+
11614
11810
  // Poor man's object comparison
11615
11811
  if (typeof status.extra !== 'undefined' && JSON.stringify(this.extra) !== JSON.stringify(status.extra)) {
11616
11812
  this.extra = { ...this.extra, ...status.extra };
@@ -11638,6 +11834,28 @@ class Participant extends Emitter {
11638
11834
  this.streams = streams;
11639
11835
  this.videoStreams = streams;
11640
11836
  }
11837
+
11838
+ async ban(apiRequestDelay = null) {
11839
+ const { meetingUuid } = this.room;
11840
+ if (!meetingUuid) {
11841
+ throw new Error('Attempting to ban a participant without a `meetingUuid`');
11842
+ }
11843
+
11844
+ // this notifies all that someone is being banned
11845
+ this.onBan(true);
11846
+
11847
+ // this allows to delay the actual ban, in order for the banned participant as well as others to react to the situation
11848
+ if (apiRequestDelay) {
11849
+ await this.delay(apiRequestDelay);
11850
+ }
11851
+
11852
+ // proceed with the actual kick
11853
+ return getApiClient().calld.banMeetingParticipant(meetingUuid, this.callId);
11854
+ }
11855
+
11856
+ async delay(ms ) {
11857
+ return new Promise(resolve => setTimeout(resolve, ms));
11858
+ }
11641
11859
  }
11642
11860
 
11643
11861
  //
@@ -11790,7 +12008,7 @@ class Room$1 extends Emitter {
11790
12008
  logger$3.info('connecting to room', { extension, audioOnly, room: !!room });
11791
12009
 
11792
12010
  if (!room) {
11793
- await Wazo.Phone.connect();
12011
+ await Wazo.Phone.connect({ media: constraints });
11794
12012
 
11795
12013
  const withCamera = constraints && !!constraints.video;
11796
12014
 
@@ -12235,7 +12453,7 @@ class Room$1 extends Emitter {
12235
12453
  const participant = this._getParticipantFromCallId(status.callId);
12236
12454
 
12237
12455
  if (participant) {
12238
- // we're received, so no need to broadcast, hence the input false arg
12456
+ // we're receiving, so no need to broadcast
12239
12457
  participant.updateStatus(status, false);
12240
12458
  }
12241
12459
  break;
@@ -12502,7 +12720,7 @@ class SipRoom extends Room$1 {
12502
12720
  logger$2.info('connecting to sip room', { extension, audioOnly, room: !!room });
12503
12721
 
12504
12722
  if (!room) {
12505
- await Wazo.Phone.connect();
12723
+ await Wazo.Phone.connect({ media: constraints });
12506
12724
 
12507
12725
  const withCamera = constraints && !!constraints.video;
12508
12726
 
@@ -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
  });