@wazo/sdk 0.38.7 → 0.38.10

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 (121) hide show
  1. package/dist/wazo-sdk.js +2 -2
  2. package/esm/__tests__/api-client.test.js +163 -2
  3. package/esm/__tests__/web-rtc-client.test.js +248 -27
  4. package/esm/api/auth.js +12 -0
  5. package/esm/api/calld.js +8 -0
  6. package/esm/api/confd.js +134 -2
  7. package/esm/api/ctid-ng.js +1 -0
  8. package/esm/api-client.js +163 -2
  9. package/esm/checker/Checker.js +204 -24
  10. package/esm/checker/checks/aor.js +163 -2
  11. package/esm/checker/checks/api.js +163 -2
  12. package/esm/checker/checks/index.js +204 -24
  13. package/esm/checker/checks/wazo-websocket.js +2 -0
  14. package/esm/checker/checks/webrtc-transport.js +202 -24
  15. package/esm/checker/checks/webrtc.js +202 -24
  16. package/esm/domain/AdHocAPIConference.js +170 -4
  17. package/esm/domain/Features.js +170 -4
  18. package/esm/domain/Meeting.js +18 -0
  19. package/esm/domain/MeetingAuthorization.js +70 -0
  20. package/esm/domain/Phone/CTIPhone.js +170 -4
  21. package/esm/domain/Phone/WebRTCPhone.js +2 -3
  22. package/esm/domain/__tests__/Meeting.test.js +87 -1
  23. package/esm/domain/__tests__/MeetingAuthorization.test.js +109 -0
  24. package/esm/index.js +300 -36
  25. package/esm/service/CallApi.js +170 -4
  26. package/esm/service/getApiClient.js +176 -5
  27. package/esm/simple/Auth.js +301 -37
  28. package/esm/simple/Configuration.js +300 -36
  29. package/esm/simple/Directory.js +170 -4
  30. package/esm/simple/Phone.js +300 -36
  31. package/esm/simple/Softphone.js +5 -0
  32. package/esm/simple/Websocket.js +3 -0
  33. package/esm/simple/index.js +300 -36
  34. package/esm/simple/room/LocalParticipant.js +300 -36
  35. package/esm/simple/room/Participant.js +300 -36
  36. package/esm/simple/room/RemoteParticipant.js +300 -36
  37. package/esm/simple/room/Room.js +300 -36
  38. package/esm/simple/room/SipRoom.js +300 -36
  39. package/esm/simple/room/Stream.js +300 -36
  40. package/esm/simple/room/__tests__/Participant.test.js +14812 -0
  41. package/esm/simple/room/__tests__/RemoteParticipant.test.js +300 -36
  42. package/esm/simple/utils.js +300 -36
  43. package/esm/utils/__tests__/object.test.js +57 -0
  44. package/esm/utils/__tests__/string.test.js +30 -0
  45. package/esm/utils/object.js +24 -0
  46. package/esm/utils/string.js +10 -0
  47. package/esm/web-rtc-client.js +202 -24
  48. package/esm/websocket-client.js +3 -1
  49. package/lib/__tests__/api-client.test.js +163 -2
  50. package/lib/__tests__/web-rtc-client.test.js +248 -27
  51. package/lib/api/auth.js +12 -0
  52. package/lib/api/calld.js +8 -0
  53. package/lib/api/confd.js +134 -2
  54. package/lib/api/ctid-ng.js +1 -0
  55. package/lib/api-client.js +163 -2
  56. package/lib/checker/Checker.js +204 -24
  57. package/lib/checker/checks/aor.js +163 -2
  58. package/lib/checker/checks/api.js +163 -2
  59. package/lib/checker/checks/index.js +204 -24
  60. package/lib/checker/checks/wazo-websocket.js +2 -0
  61. package/lib/checker/checks/webrtc-transport.js +202 -24
  62. package/lib/checker/checks/webrtc.js +202 -24
  63. package/lib/domain/AdHocAPIConference.js +170 -4
  64. package/lib/domain/Features.js +170 -4
  65. package/lib/domain/Meeting.js +18 -0
  66. package/lib/domain/MeetingAuthorization.js +79 -0
  67. package/lib/domain/Phone/CTIPhone.js +170 -4
  68. package/lib/domain/Phone/WebRTCPhone.js +2 -3
  69. package/lib/domain/__tests__/Meeting.test.js +87 -1
  70. package/lib/domain/__tests__/MeetingAuthorization.test.js +111 -0
  71. package/lib/index.js +300 -36
  72. package/lib/service/CallApi.js +170 -4
  73. package/lib/service/getApiClient.js +176 -4
  74. package/lib/simple/Auth.js +301 -36
  75. package/lib/simple/Configuration.js +300 -36
  76. package/lib/simple/Directory.js +170 -4
  77. package/lib/simple/Phone.js +300 -36
  78. package/lib/simple/Softphone.js +5 -0
  79. package/lib/simple/Websocket.js +3 -0
  80. package/lib/simple/index.js +300 -36
  81. package/lib/simple/room/LocalParticipant.js +300 -36
  82. package/lib/simple/room/Participant.js +300 -36
  83. package/lib/simple/room/RemoteParticipant.js +300 -36
  84. package/lib/simple/room/Room.js +300 -36
  85. package/lib/simple/room/SipRoom.js +300 -36
  86. package/lib/simple/room/Stream.js +300 -36
  87. package/lib/simple/room/__tests__/Participant.test.js +14822 -0
  88. package/lib/simple/room/__tests__/RemoteParticipant.test.js +300 -36
  89. package/lib/simple/utils.js +300 -36
  90. package/lib/utils/__tests__/object.test.js +59 -0
  91. package/lib/utils/__tests__/string.test.js +32 -0
  92. package/lib/utils/object.js +28 -0
  93. package/lib/utils/string.js +14 -0
  94. package/lib/web-rtc-client.js +202 -24
  95. package/lib/websocket-client.js +3 -0
  96. package/package.json +1 -1
  97. package/src/__tests__/web-rtc-client.test.js +46 -3
  98. package/src/api/auth.js +12 -0
  99. package/src/api/calld.js +8 -0
  100. package/src/api/confd.js +43 -2
  101. package/src/api-client.js +8 -0
  102. package/src/domain/Meeting.js +20 -0
  103. package/src/domain/MeetingAuthorization.js +67 -0
  104. package/src/domain/Phone/WebRTCPhone.js +1 -3
  105. package/src/domain/__tests__/Meeting.test.js +70 -1
  106. package/src/domain/__tests__/MeetingAuthorization.test.js +58 -0
  107. package/src/service/getApiClient.js +13 -2
  108. package/src/simple/Auth.js +35 -4
  109. package/src/simple/Softphone.js +5 -0
  110. package/src/simple/index.js +2 -1
  111. package/src/simple/room/Participant.js +40 -0
  112. package/src/simple/room/Room.js +2 -2
  113. package/src/simple/room/SipRoom.js +1 -1
  114. package/src/simple/room/__tests__/Participant.test.js +81 -0
  115. package/src/types/WebSocketMessage.js +7 -1
  116. package/src/utils/__tests__/object.test.js +35 -0
  117. package/src/utils/__tests__/string.test.js +23 -0
  118. package/src/utils/object.js +15 -0
  119. package/src/utils/string.js +8 -0
  120. package/src/web-rtc-client.js +39 -22
  121. package/src/websocket-client.js +2 -0
@@ -2227,6 +2227,7 @@ var authMethods = (client , baseUrl ) => ({
2227
2227
 
2228
2228
 
2229
2229
 
2230
+
2230
2231
  ) {
2231
2232
  const body = {
2232
2233
  backend: params.backend || DEFAULT_BACKEND_USER,
@@ -2247,9 +2248,14 @@ var authMethods = (client , baseUrl ) => ({
2247
2248
  }
2248
2249
 
2249
2250
  if (params.tenantId) {
2251
+ console.warn('Use of `tenantId` is deprecated when calling logIn() method, use `domainName` instead.');
2250
2252
  body.tenant_id = params.tenantId;
2251
2253
  }
2252
2254
 
2255
+ if (params.domainName) {
2256
+ body.domain_name = params.domainName;
2257
+ }
2258
+
2253
2259
  return client.post(`${baseUrl}/token`, body, headers).then(response => Session.parse(response));
2254
2260
  },
2255
2261
 
@@ -2262,6 +2268,7 @@ var authMethods = (client , baseUrl ) => ({
2262
2268
  expiration ,
2263
2269
  isMobile = false,
2264
2270
  tenantId ,
2271
+ domainName ,
2265
2272
  ) => {
2266
2273
  const body = {
2267
2274
  backend: backend || DEFAULT_BACKEND_USER,
@@ -2271,9 +2278,14 @@ var authMethods = (client , baseUrl ) => ({
2271
2278
  };
2272
2279
 
2273
2280
  if (tenantId) {
2281
+ console.warn('Use of `tenantId` is deprecated when calling refreshToken() method, use `domainName` instead.');
2274
2282
  body.tenant_id = tenantId;
2275
2283
  }
2276
2284
 
2285
+ if (domainName) {
2286
+ body.domain_name = domainName;
2287
+ }
2288
+
2277
2289
  const headers = {
2278
2290
  'Content-Type': 'application/json',
2279
2291
  ...(isMobile ? { 'Wazo-Session-Type': 'mobile' } : {}),
@@ -2643,6 +2655,70 @@ class ExternalApp {
2643
2655
 
2644
2656
  //
2645
2657
 
2658
+ class MeetingAuthorization {
2659
+
2660
+
2661
+
2662
+
2663
+
2664
+
2665
+ constructor({
2666
+ meetingUuid,
2667
+ uuid,
2668
+ userUuid,
2669
+ userName,
2670
+ } = {}) {
2671
+ this.meetingUuid = meetingUuid;
2672
+ this.uuid = uuid;
2673
+ this.userUuid = userUuid;
2674
+ this.userName = userName;
2675
+ }
2676
+
2677
+ setStatus(status ) {
2678
+ this.status = status;
2679
+ }
2680
+
2681
+ getStatus() {
2682
+ return this.status;
2683
+ }
2684
+
2685
+ static parse(plain ) {
2686
+ const {
2687
+ meeting_uuid: meetingUuid,
2688
+ uuid,
2689
+ guest_uuid: userUuid,
2690
+ guest_name: userName,
2691
+ } = plain;
2692
+
2693
+ return new MeetingAuthorization({
2694
+ meetingUuid,
2695
+ uuid,
2696
+ userUuid,
2697
+ userName,
2698
+ });
2699
+ }
2700
+
2701
+ static parseMany(items ) {
2702
+ if (!items) {
2703
+ return [];
2704
+ }
2705
+ return items.map(MeetingAuthorization.parse);
2706
+ }
2707
+ }
2708
+
2709
+ //
2710
+
2711
+
2712
+
2713
+
2714
+
2715
+
2716
+
2717
+
2718
+
2719
+
2720
+
2721
+
2646
2722
 
2647
2723
 
2648
2724
 
@@ -2653,6 +2729,7 @@ class ExternalApp {
2653
2729
 
2654
2730
 
2655
2731
 
2732
+
2656
2733
 
2657
2734
 
2658
2735
  class Meeting {
@@ -2667,6 +2744,8 @@ class Meeting {
2667
2744
 
2668
2745
 
2669
2746
 
2747
+
2748
+
2670
2749
 
2671
2750
  static parse(plain ) {
2672
2751
  return new Meeting({
@@ -2679,6 +2758,7 @@ class Meeting {
2679
2758
  extension: plain.exten,
2680
2759
  persistent: plain.persistent,
2681
2760
  creationTime: moment(plain.creation_time).toDate(),
2761
+ requireAuthorization: plain.require_authorization,
2682
2762
  });
2683
2763
  }
2684
2764
 
@@ -2703,6 +2783,7 @@ class Meeting {
2703
2783
  extension,
2704
2784
  persistent,
2705
2785
  creationTime,
2786
+ requireAuthorization,
2706
2787
  } = {}) {
2707
2788
  this.guestSipAuthorization = guestSipAuthorization;
2708
2789
  this.uri = uri;
@@ -2713,6 +2794,7 @@ class Meeting {
2713
2794
  this.extension = extension;
2714
2795
  this.persistent = persistent;
2715
2796
  this.creationTime = creationTime;
2797
+ this.requireAuthorization = requireAuthorization;
2716
2798
 
2717
2799
  // Useful to compare instead of instanceof with minified code
2718
2800
  this.type = 'Meeting';
@@ -2723,8 +2805,32 @@ class Meeting {
2723
2805
  const [username, secret] = atob(this.guestSipAuthorization).split(':');
2724
2806
  return { username, secret };
2725
2807
  }
2808
+
2726
2809
  }
2727
2810
 
2811
+ //
2812
+
2813
+ const camelToUnderscore = (key ) => {
2814
+ if (typeof key !== 'string') {
2815
+ throw new Error('Input is not a string');
2816
+ }
2817
+ return key.charAt(0).toLowerCase() + key.substring(1).replace(/([A-Z])/g, '_$1').toLowerCase();
2818
+ };
2819
+
2820
+ //
2821
+
2822
+ const convertKeysFromCamelToUnderscore = (args ) => {
2823
+ if (!args || typeof args !== 'object' || Array.isArray(args)) {
2824
+ throw new Error('Input is not an object');
2825
+ }
2826
+
2827
+ return Object.keys(args).reduce((acc, key) => {
2828
+ acc[camelToUnderscore(key)] = typeof args[key] === 'object' && !Array.isArray(args[key])
2829
+ ? convertKeysFromCamelToUnderscore(args[key]) : args[key];
2830
+ return acc;
2831
+ }, {});
2832
+ };
2833
+
2728
2834
  /* */
2729
2835
 
2730
2836
  var confdMethods = (client , baseUrl ) => ({
@@ -2793,8 +2899,18 @@ var confdMethods = (client , baseUrl ) => ({
2793
2899
  getMyMeetings: () =>
2794
2900
  client.get(`${baseUrl}/users/me/meetings`).then(response => Meeting.parseMany(response.items)),
2795
2901
 
2796
- createMyMeeting: (name , persistent ) =>
2797
- client.post(`${baseUrl}/users/me/meetings`, { name, persistent }).then(Meeting.parse),
2902
+ createMyMeeting: (args ) =>
2903
+ client
2904
+ .post(`${baseUrl}/users/me/meetings`, convertKeysFromCamelToUnderscore(args))
2905
+ .then(Meeting.parse),
2906
+
2907
+ updateMyMeeting: (meetingUuid , data ) =>
2908
+ client.put(
2909
+ `${baseUrl}/users/me/meetings/${meetingUuid}`,
2910
+ convertKeysFromCamelToUnderscore(data),
2911
+ null,
2912
+ ApiRequester.successResponseParser,
2913
+ ),
2798
2914
 
2799
2915
  deleteMyMeeting: (meetingUuid ) =>
2800
2916
  client.delete(`${baseUrl}/users/me/meetings/${meetingUuid}`, null),
@@ -2802,8 +2918,36 @@ var confdMethods = (client , baseUrl ) => ({
2802
2918
  getMeeting: (meetingUuid ) =>
2803
2919
  client.get(`${baseUrl}/meetings/${meetingUuid}`, null).then(Meeting.parse),
2804
2920
 
2921
+ meetingAuthorizations: (meetingUuid ) =>
2922
+ client.get(`${baseUrl}/users/me/meetings/${meetingUuid}/authorizations`, null).then(MeetingAuthorization.parseMany),
2923
+
2924
+ meetingAuthorizationReject: (meetingUuid , authorizationUuid ) =>
2925
+ client.put(
2926
+ `${baseUrl}/users/me/meetings/${meetingUuid}/authorizations/${authorizationUuid}/reject`,
2927
+ {},
2928
+ null,
2929
+ ApiRequester.successResponseParser,
2930
+ ),
2931
+
2932
+ meetingAuthorizationAccept: (meetingUuid , authorizationUuid ) =>
2933
+ client.put(
2934
+ `${baseUrl}/users/me/meetings/${meetingUuid}/authorizations/${authorizationUuid}/accept`,
2935
+ {},
2936
+ null,
2937
+ ApiRequester.successResponseParser,
2938
+ ),
2939
+
2805
2940
  guestGetMeeting: (meetingUuid ) =>
2806
2941
  client.get(`${baseUrl}/guests/me/meetings/${meetingUuid}`, null).then(Meeting.parse),
2942
+
2943
+ guestAuthorizationRequest: (userUuid , meetingUuid , username ) =>
2944
+ client
2945
+ .post(`${baseUrl}/guests/${userUuid}/meetings/${meetingUuid}/authorizations`, { guest_name: username })
2946
+ .then(MeetingAuthorization.parse),
2947
+
2948
+ guestAuthorizationCheck: (userUuid , meetingUuid , authorizationUuid ) =>
2949
+ client.get(`${baseUrl}/guests/${userUuid}/meetings/${meetingUuid}/authorizations/${authorizationUuid}`, null),
2950
+
2807
2951
  });
2808
2952
 
2809
2953
  //
@@ -3594,6 +3738,7 @@ global.wazoClientId = global.wazoClientId || {};
3594
3738
  global.wazoClientToken = global.wazoClientToken || {};
3595
3739
  global.wazoRefreshToken = global.wazoRefreshToken || {};
3596
3740
  global.wazoRefreshTenantId = global.wazoRefreshTenantId || {};
3741
+ global.wazoRefreshDomainName = global.wazoRefreshDomainName || {};
3597
3742
  global.wazoOnRefreshToken = global.wazoOnRefreshToken || {};
3598
3743
  global.wazoOnRefreshTokenError = global.wazoOnRefreshTokenError || {};
3599
3744
  global.wazoRefreshExpiration = global.wazoRefreshExpiration || {};
@@ -4268,6 +4413,14 @@ var calldMethods = (client , baseUrl ) => ({
4268
4413
  getMeetingParticipantsAsUser: async (meetingUuid ) =>
4269
4414
  client.get(`${baseUrl}/users/me/meetings/${meetingUuid}/participants`),
4270
4415
 
4416
+ banMeetingParticipant: (meetingUuid , participantUuid ) =>
4417
+ client.delete(
4418
+ `${baseUrl}/users/me/meetings/${meetingUuid}/participants/${participantUuid}`,
4419
+ null,
4420
+ null,
4421
+ ApiRequester.successResponseParser,
4422
+ ),
4423
+
4271
4424
  listTrunks: () => client.get(`${baseUrl}/trunks`),
4272
4425
 
4273
4426
  mute: (callId ) =>
@@ -4645,6 +4798,7 @@ class ApiClient {
4645
4798
 
4646
4799
 
4647
4800
 
4801
+
4648
4802
 
4649
4803
 
4650
4804
 
@@ -4686,6 +4840,7 @@ class ApiClient {
4686
4840
  refreshToken: this.refreshToken,
4687
4841
  refreshBackend: this.refreshBackend,
4688
4842
  refreshTenantId: this.refreshTenantId,
4843
+ refreshDomainName: this.refreshDomainName,
4689
4844
  refreshExpiration: this.refreshExpiration,
4690
4845
  isMobile: this.isMobile,
4691
4846
  });
@@ -4701,6 +4856,7 @@ class ApiClient {
4701
4856
  this.refreshExpiration,
4702
4857
  this.isMobile,
4703
4858
  this.refreshTenantId,
4859
+ this.refreshDomainName,
4704
4860
  );
4705
4861
 
4706
4862
  logger$3.info('token refreshed', { token: session.token });
@@ -4754,9 +4910,14 @@ class ApiClient {
4754
4910
  }
4755
4911
 
4756
4912
  setRefreshTenantId(tenantId ) {
4913
+ console.warn('Use of `setRefreshTenantId` is deprecated, use `setRefreshDomainName` instead');
4757
4914
  this.refreshTenantId = tenantId;
4758
4915
  }
4759
4916
 
4917
+ setRefreshDomainName(domainName ) {
4918
+ this.refreshDomainName = domainName;
4919
+ }
4920
+
4760
4921
  setIsMobile(isMobile ) {
4761
4922
  this.isMobile = isMobile;
4762
4923
  }
@@ -5059,6 +5220,7 @@ const AGENT_UNPAUSED = 'agent_unpaused';
5059
5220
  const CONFERENCE_ADHOC_PARTICIPANT_LEFT = 'conference_adhoc_participant_left';
5060
5221
  const CONFERENCE_ADHOC_DELETED = 'conference_adhoc_deleted';
5061
5222
  const MEETING_USER_PROGRESS = 'meeting_user_progress';
5223
+ const MEETING_USER_GUEST_AUTHORIZATION_CREATED = 'meeting_user_guest_authorization_created';
5062
5224
 
5063
5225
  const BLACKLIST_EVENTS = [
5064
5226
  CHAT_MESSAGE_SENT,
@@ -5410,6 +5572,7 @@ WebSocketClient.eventLists = [
5410
5572
  CONFERENCE_ADHOC_PARTICIPANT_LEFT,
5411
5573
  CONFERENCE_ADHOC_DELETED,
5412
5574
  MEETING_USER_PROGRESS,
5575
+ MEETING_USER_GUEST_AUTHORIZATION_CREATED,
5413
5576
  ];
5414
5577
 
5415
5578
  var wazoWebsocket = {
@@ -7026,7 +7189,7 @@ class WebRTCClient extends Emitter {
7026
7189
  });
7027
7190
  }
7028
7191
 
7029
- changeAudioInputDevice(id , session , force ) {
7192
+ async changeAudioInputDevice(id , session , force ) {
7030
7193
  const currentId = this.getAudioDeviceId();
7031
7194
  logger$1.info('setting audio input device', { id, currentId, session: !!session });
7032
7195
 
@@ -7034,33 +7197,50 @@ class WebRTCClient extends Emitter {
7034
7197
  return null;
7035
7198
  }
7036
7199
 
7200
+ // in order to handle an audio track change for default devices
7201
+ // we need the actual id of the device (not 'default')
7202
+ let deviceId = id;
7203
+ if (id === 'default' && navigator.mediaDevices) {
7204
+ const devices = await navigator.mediaDevices.enumerateDevices();
7205
+ const defaultDevice = devices.find(device => device.deviceId === 'default');
7206
+ if (defaultDevice) {
7207
+ const deviceLabel = defaultDevice.label.replace('Default - ', '');
7208
+ const targetDevice = devices.find(device => device.label === deviceLabel);
7209
+ if (targetDevice) {
7210
+ deviceId = targetDevice.deviceId;
7211
+ if (!force && deviceId === currentId) {
7212
+ return null;
7213
+ }
7214
+ }
7215
+ }
7216
+ }
7217
+
7037
7218
  // let's update the local audio value
7038
7219
  if (this.audio) {
7039
7220
  this.audio = {
7040
7221
  deviceId: {
7041
- exact: id,
7222
+ exact: deviceId,
7042
7223
  },
7043
7224
  };
7044
7225
  }
7045
7226
 
7046
- if (session) {
7227
+ if (session && navigator.mediaDevices) {
7047
7228
  const sdh = session.sessionDescriptionHandler;
7048
7229
  const pc = sdh.peerConnection;
7049
7230
 
7050
- // $FlowFixMe
7051
- return navigator.mediaDevices.getUserMedia({ audio: { deviceId: { exact: id } } }).then(async stream => {
7052
- const audioTrack = stream.getAudioTracks()[0];
7053
- const sender = pc && pc.getSenders().find(s => audioTrack && s && s.track && s.track.kind === audioTrack.kind);
7231
+ const constraints = { audio: { deviceId: { exact: deviceId } } };
7232
+ const stream = await navigator.mediaDevices.getUserMedia(constraints);
7233
+ const audioTrack = stream.getAudioTracks()[0];
7234
+ const sender = pc && pc.getSenders().find(s => audioTrack && s && s.track && s.track.kind === audioTrack.kind);
7054
7235
 
7055
- if (sender) {
7056
- if (sender.track) {
7057
- audioTrack.enabled = sender.track.enabled;
7058
- }
7059
- sender.replaceTrack(audioTrack);
7236
+ if (sender) {
7237
+ if (sender.track) {
7238
+ audioTrack.enabled = sender.track.enabled;
7060
7239
  }
7240
+ sender.replaceTrack(audioTrack);
7241
+ }
7061
7242
 
7062
- return stream;
7063
- });
7243
+ return stream;
7064
7244
  }
7065
7245
  }
7066
7246
 
@@ -7080,14 +7260,14 @@ class WebRTCClient extends Emitter {
7080
7260
  return null;
7081
7261
  }
7082
7262
 
7083
- // let's update the local video value
7084
- if (this.video) {
7085
- this.video = {
7086
- deviceId: {
7087
- exact: id,
7088
- },
7089
- };
7090
- }
7263
+ // let's make sure we don't lose other video constraints settings -- width, height, frameRate...
7264
+ const videoObject = typeof this.video === 'object' ? this.video : {};
7265
+ this.video = {
7266
+ ...videoObject,
7267
+ deviceId: {
7268
+ exact: id,
7269
+ },
7270
+ };
7091
7271
  }
7092
7272
 
7093
7273
  changeSessionVideoInputDevice(id , session ) {