@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
@@ -49,6 +49,7 @@ const RECORD_STATE_ACTIVE = 'active';
49
49
 
50
50
 
51
51
 
52
+
52
53
 
53
54
 
54
55
 
@@ -59,6 +60,7 @@ const RECORD_STATE_ACTIVE = 'active';
59
60
 
60
61
 
61
62
 
63
+
62
64
 
63
65
 
64
66
 
@@ -87,6 +89,7 @@ class Call {
87
89
 
88
90
 
89
91
 
92
+
90
93
 
91
94
 
92
95
 
@@ -111,6 +114,7 @@ class Call {
111
114
  calleeNumber: plain.peer_caller_id_number,
112
115
  dialedExtension: plain.dialed_extension,
113
116
  isCaller: plain.is_caller,
117
+ isVideo: plain.is_video,
114
118
  muted: plain.muted,
115
119
  onHold: plain.on_hold,
116
120
  status: plain.status,
@@ -134,6 +138,7 @@ class Call {
134
138
  calleeNumber,
135
139
  dialedExtension,
136
140
  isCaller,
141
+ isVideo,
137
142
  lineId,
138
143
  muted,
139
144
  onHold,
@@ -157,6 +162,7 @@ class Call {
157
162
  this.startingTime = startingTime;
158
163
  this.talkingToIds = talkingToIds || [];
159
164
  this.recording = recording;
165
+ this.isVideo = !!isVideo;
160
166
 
161
167
  // Useful to compare instead of instanceof with minified code
162
168
  this.type = 'Call';
@@ -630,7 +636,7 @@ class CallSession {
630
636
  ringing: call.isRinging(),
631
637
  answered: call.isUp(),
632
638
  answeredBySystem: call.isUp() && call.talkingToIds.length === 0,
633
- cameraEnabled: false,
639
+ cameraEnabled: call.isVideo,
634
640
  dialedExtension: call.dialedExtension,
635
641
  call,
636
642
  conference: false, // @FIXME?
@@ -3248,6 +3254,70 @@ class ExternalApp {
3248
3254
 
3249
3255
  //
3250
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
+
3251
3321
 
3252
3322
 
3253
3323
 
@@ -3258,6 +3328,7 @@ class ExternalApp {
3258
3328
 
3259
3329
 
3260
3330
 
3331
+
3261
3332
 
3262
3333
 
3263
3334
  class Meeting {
@@ -3272,6 +3343,8 @@ class Meeting {
3272
3343
 
3273
3344
 
3274
3345
 
3346
+
3347
+
3275
3348
 
3276
3349
  static parse(plain ) {
3277
3350
  return new Meeting({
@@ -3284,6 +3357,7 @@ class Meeting {
3284
3357
  extension: plain.exten,
3285
3358
  persistent: plain.persistent,
3286
3359
  creationTime: moment(plain.creation_time).toDate(),
3360
+ requireAuthorization: plain.require_authorization,
3287
3361
  });
3288
3362
  }
3289
3363
 
@@ -3308,6 +3382,7 @@ class Meeting {
3308
3382
  extension,
3309
3383
  persistent,
3310
3384
  creationTime,
3385
+ requireAuthorization,
3311
3386
  } = {}) {
3312
3387
  this.guestSipAuthorization = guestSipAuthorization;
3313
3388
  this.uri = uri;
@@ -3318,6 +3393,7 @@ class Meeting {
3318
3393
  this.extension = extension;
3319
3394
  this.persistent = persistent;
3320
3395
  this.creationTime = creationTime;
3396
+ this.requireAuthorization = requireAuthorization;
3321
3397
 
3322
3398
  // Useful to compare instead of instanceof with minified code
3323
3399
  this.type = 'Meeting';
@@ -3328,8 +3404,32 @@ class Meeting {
3328
3404
  const [username, secret] = atob(this.guestSipAuthorization).split(':');
3329
3405
  return { username, secret };
3330
3406
  }
3407
+
3331
3408
  }
3332
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
+
3333
3433
  /* */
3334
3434
 
3335
3435
  var confdMethods = (client , baseUrl ) => ({
@@ -3398,8 +3498,18 @@ var confdMethods = (client , baseUrl ) => ({
3398
3498
  getMyMeetings: () =>
3399
3499
  client.get(`${baseUrl}/users/me/meetings`).then(response => Meeting.parseMany(response.items)),
3400
3500
 
3401
- createMyMeeting: (name , persistent ) =>
3402
- 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
+ ),
3403
3513
 
3404
3514
  deleteMyMeeting: (meetingUuid ) =>
3405
3515
  client.delete(`${baseUrl}/users/me/meetings/${meetingUuid}`, null),
@@ -3407,8 +3517,36 @@ var confdMethods = (client , baseUrl ) => ({
3407
3517
  getMeeting: (meetingUuid ) =>
3408
3518
  client.get(`${baseUrl}/meetings/${meetingUuid}`, null).then(Meeting.parse),
3409
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
+
3410
3539
  guestGetMeeting: (meetingUuid ) =>
3411
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
+
3412
3550
  });
3413
3551
 
3414
3552
  //
@@ -5050,6 +5188,14 @@ var calldMethods = (client , baseUrl ) => ({
5050
5188
  getMeetingParticipantsAsUser: async (meetingUuid ) =>
5051
5189
  client.get(`${baseUrl}/users/me/meetings/${meetingUuid}/participants`),
5052
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
+
5053
5199
  listTrunks: () => client.get(`${baseUrl}/trunks`),
5054
5200
 
5055
5201
  mute: (callId ) =>
@@ -5897,6 +6043,24 @@ const fixSdp = (sdp , candidates , forcePort = true)
5897
6043
  return fixed;
5898
6044
  };
5899
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
+
5900
6064
  /* global RTCSessionDescriptionInit, navigator */
5901
6065
 
5902
6066
  const wazoLogger = IssueReporter$1 ? IssueReporter$1.loggerFor('webrtc-sdh') : console;
@@ -6026,7 +6190,10 @@ class WazoSessionDescriptionHandler extends SessionDescriptionHandler {
6026
6190
 
6027
6191
  // Check if we got ICEs
6028
6192
  if (sdp.indexOf('a=candidate') !== -1) {
6029
- return description;
6193
+ return {
6194
+ type: description.type,
6195
+ sdp: addIcesInAllBundles(sdp),
6196
+ };
6030
6197
  }
6031
6198
 
6032
6199
  wazoLogger.info('No ICE candidates found in SDP, fixing it with gathered ices', this.gatheredCandidates);
@@ -7486,41 +7653,58 @@ class WebRTCClient extends Emitter {
7486
7653
  });
7487
7654
  }
7488
7655
 
7489
- changeAudioInputDevice(id , session ) {
7656
+ async changeAudioInputDevice(id , session , force ) {
7490
7657
  const currentId = this.getAudioDeviceId();
7491
7658
  logger$9.info('setting audio input device', { id, currentId, session: !!session });
7492
7659
 
7493
- if (id === currentId) {
7660
+ if (!force && id === currentId) {
7494
7661
  return null;
7495
7662
  }
7496
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
+
7497
7682
  // let's update the local audio value
7498
7683
  if (this.audio) {
7499
7684
  this.audio = {
7500
7685
  deviceId: {
7501
- exact: id,
7686
+ exact: deviceId,
7502
7687
  },
7503
7688
  };
7504
7689
  }
7505
7690
 
7506
- if (session) {
7691
+ if (session && navigator.mediaDevices) {
7507
7692
  const sdh = session.sessionDescriptionHandler;
7508
7693
  const pc = sdh.peerConnection;
7509
7694
 
7510
- // $FlowFixMe
7511
- return navigator.mediaDevices.getUserMedia({ audio: { deviceId: { exact: id } } }).then(async stream => {
7512
- const audioTrack = stream.getAudioTracks()[0];
7513
- 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);
7514
7699
 
7515
- if (sender) {
7516
- if (sender.track) {
7517
- audioTrack.enabled = sender.track.enabled;
7518
- }
7519
- sender.replaceTrack(audioTrack);
7700
+ if (sender) {
7701
+ if (sender.track) {
7702
+ audioTrack.enabled = sender.track.enabled;
7520
7703
  }
7704
+ sender.replaceTrack(audioTrack);
7705
+ }
7521
7706
 
7522
- return stream;
7523
- });
7707
+ return stream;
7524
7708
  }
7525
7709
  }
7526
7710
 
@@ -7540,14 +7724,14 @@ class WebRTCClient extends Emitter {
7540
7724
  return null;
7541
7725
  }
7542
7726
 
7543
- // let's update the local video value
7544
- if (this.video) {
7545
- this.video = {
7546
- deviceId: {
7547
- exact: id,
7548
- },
7549
- };
7550
- }
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
+ };
7551
7735
  }
7552
7736
 
7553
7737
  changeSessionVideoInputDevice(id , session ) {
@@ -9286,10 +9470,10 @@ class WebRTCPhone extends Emitter {
9286
9470
  this.audioRingVolume = volume;
9287
9471
  }
9288
9472
 
9289
- changeAudioInputDevice(id ) {
9473
+ changeAudioInputDevice(id , force ) {
9290
9474
  logger$8.info('WebRTC phone - changeAudio input device', { deviceId: id });
9291
9475
 
9292
- return this.client.changeAudioInputDevice(id, this.currentSipSession);
9476
+ return this.client.changeAudioInputDevice(id, this.currentSipSession, force);
9293
9477
  }
9294
9478
 
9295
9479
  changeVideoInputDevice(id ) {
@@ -10825,6 +11009,7 @@ const AGENT_UNPAUSED = 'agent_unpaused';
10825
11009
  const CONFERENCE_ADHOC_PARTICIPANT_LEFT = 'conference_adhoc_participant_left';
10826
11010
  const CONFERENCE_ADHOC_DELETED = 'conference_adhoc_deleted';
10827
11011
  const MEETING_USER_PROGRESS = 'meeting_user_progress';
11012
+ const MEETING_USER_GUEST_AUTHORIZATION_CREATED = 'meeting_user_guest_authorization_created';
10828
11013
 
10829
11014
  const BLACKLIST_EVENTS = [
10830
11015
  CHAT_MESSAGE_SENT,
@@ -11176,6 +11361,7 @@ WebSocketClient.eventLists = [
11176
11361
  CONFERENCE_ADHOC_PARTICIPANT_LEFT,
11177
11362
  CONFERENCE_ADHOC_DELETED,
11178
11363
  MEETING_USER_PROGRESS,
11364
+ MEETING_USER_GUEST_AUTHORIZATION_CREATED,
11179
11365
  ];
11180
11366
 
11181
11367
  var WebSocketClient$1 = /*#__PURE__*/Object.freeze({
@@ -11247,6 +11433,7 @@ var WebSocketClient$1 = /*#__PURE__*/Object.freeze({
11247
11433
  CONFERENCE_ADHOC_PARTICIPANT_LEFT: CONFERENCE_ADHOC_PARTICIPANT_LEFT,
11248
11434
  CONFERENCE_ADHOC_DELETED: CONFERENCE_ADHOC_DELETED,
11249
11435
  MEETING_USER_PROGRESS: MEETING_USER_PROGRESS,
11436
+ MEETING_USER_GUEST_AUTHORIZATION_CREATED: MEETING_USER_GUEST_AUTHORIZATION_CREATED,
11250
11437
  HEARTBEAT_ENGINE_VERSION: HEARTBEAT_ENGINE_VERSION,
11251
11438
  'default': WebSocketClient
11252
11439
  });
@@ -11351,6 +11538,7 @@ class Participant extends Emitter {
11351
11538
 
11352
11539
 
11353
11540
 
11541
+
11354
11542
 
11355
11543
 
11356
11544
 
@@ -11368,6 +11556,7 @@ class Participant extends Emitter {
11368
11556
 
11369
11557
 
11370
11558
 
11559
+
11371
11560
 
11372
11561
  /**
11373
11562
  * @param room Room The room where the participant is
@@ -11391,6 +11580,7 @@ class Participant extends Emitter {
11391
11580
  this.screensharing = false;
11392
11581
  this.isOnHold = false;
11393
11582
  this.extra = extra;
11583
+ this.banned = false;
11394
11584
 
11395
11585
  this.ON_UPDATED = 'participant/ON_UPDATED';
11396
11586
  this.ON_START_TALKING = 'participant/ON_START_TALKING';
@@ -11407,6 +11597,7 @@ class Participant extends Emitter {
11407
11597
  this.ON_EXTRA_CHANGE = 'participant/ON_EXTRA_CHANGE';
11408
11598
  this.ON_HOLD = 'participant/ON_HOLD';
11409
11599
  this.ON_RESUME = 'participant/ON_RESUME';
11600
+ this.ON_BAN = 'participant/ON_BAN';
11410
11601
  }
11411
11602
 
11412
11603
  triggerEvent(name , ...args ) {
@@ -11447,6 +11638,10 @@ class Participant extends Emitter {
11447
11638
  status.extra = this.extra;
11448
11639
  break;
11449
11640
  }
11641
+ case this.ON_BAN: {
11642
+ status.banned = true;
11643
+ break;
11644
+ }
11450
11645
  }
11451
11646
 
11452
11647
  if (broadcast) {
@@ -11549,6 +11744,11 @@ class Participant extends Emitter {
11549
11744
  this.triggerUpdate(this.ON_RESUME, broadcast);
11550
11745
  }
11551
11746
 
11747
+ onBan(broadcast = true) {
11748
+ this.banned = true;
11749
+ this.triggerUpdate(this.ON_BAN, broadcast);
11750
+ }
11751
+
11552
11752
  getStatus() {
11553
11753
  return {
11554
11754
  callId: this.callId,
@@ -11595,6 +11795,10 @@ class Participant extends Emitter {
11595
11795
  }
11596
11796
  }
11597
11797
 
11798
+ if (status.banned) {
11799
+ this.onBan(false);
11800
+ }
11801
+
11598
11802
  // Poor man's object comparison
11599
11803
  if (typeof status.extra !== 'undefined' && JSON.stringify(this.extra) !== JSON.stringify(status.extra)) {
11600
11804
  this.extra = { ...this.extra, ...status.extra };
@@ -11622,6 +11826,28 @@ class Participant extends Emitter {
11622
11826
  this.streams = streams;
11623
11827
  this.videoStreams = streams;
11624
11828
  }
11829
+
11830
+ async ban(apiRequestDelay = null) {
11831
+ const { meetingUuid } = this.room;
11832
+ if (!meetingUuid) {
11833
+ throw new Error('Attempting to ban a participant without a `meetingUuid`');
11834
+ }
11835
+
11836
+ // this notifies all that someone is being banned
11837
+ this.onBan(true);
11838
+
11839
+ // this allows to delay the actual ban, in order for the banned participant as well as others to react to the situation
11840
+ if (apiRequestDelay) {
11841
+ await this.delay(apiRequestDelay);
11842
+ }
11843
+
11844
+ // proceed with the actual kick
11845
+ return getApiClient().calld.banMeetingParticipant(meetingUuid, this.callId);
11846
+ }
11847
+
11848
+ async delay(ms ) {
11849
+ return new Promise(resolve => setTimeout(resolve, ms));
11850
+ }
11625
11851
  }
11626
11852
 
11627
11853
  //
@@ -11774,7 +12000,7 @@ class Room$1 extends Emitter {
11774
12000
  logger$3.info('connecting to room', { extension, audioOnly, room: !!room });
11775
12001
 
11776
12002
  if (!room) {
11777
- await Wazo.Phone.connect();
12003
+ await Wazo.Phone.connect({ media: constraints });
11778
12004
 
11779
12005
  const withCamera = constraints && !!constraints.video;
11780
12006
 
@@ -12219,7 +12445,7 @@ class Room$1 extends Emitter {
12219
12445
  const participant = this._getParticipantFromCallId(status.callId);
12220
12446
 
12221
12447
  if (participant) {
12222
- // we're received, so no need to broadcast, hence the input false arg
12448
+ // we're receiving, so no need to broadcast
12223
12449
  participant.updateStatus(status, false);
12224
12450
  }
12225
12451
  break;
@@ -12486,7 +12712,7 @@ class SipRoom extends Room$1 {
12486
12712
  logger$2.info('connecting to sip room', { extension, audioOnly, room: !!room });
12487
12713
 
12488
12714
  if (!room) {
12489
- await Wazo.Phone.connect();
12715
+ await Wazo.Phone.connect({ media: constraints });
12490
12716
 
12491
12717
  const withCamera = constraints && !!constraints.video;
12492
12718
 
@@ -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
  });