@wazo/sdk 0.37.20 → 0.37.21

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 (110) hide show
  1. package/dist/wazo-sdk.js +5 -5
  2. package/esm/__tests__/api-client.test.js +44 -5
  3. package/esm/__tests__/web-rtc-client.test.js +70 -15
  4. package/esm/api/agentd.js +25 -2
  5. package/esm/api/amid.js +25 -2
  6. package/esm/api/application.js +25 -2
  7. package/esm/api/auth.js +25 -2
  8. package/esm/api/call-logd.js +25 -2
  9. package/esm/api/calld.js +25 -2
  10. package/esm/api/chatd.js +25 -2
  11. package/esm/api/confd.js +44 -5
  12. package/esm/api/ctid-ng.js +25 -2
  13. package/esm/api/dird.js +25 -2
  14. package/esm/api/webhookd.js +25 -2
  15. package/esm/api-client.js +44 -5
  16. package/esm/checker/Checker.js +72 -15
  17. package/esm/checker/checks/aor.js +44 -5
  18. package/esm/checker/checks/api.js +44 -5
  19. package/esm/checker/checks/index.js +72 -15
  20. package/esm/checker/checks/wazo-websocket.js +27 -2
  21. package/esm/checker/checks/webrtc-transport.js +70 -15
  22. package/esm/checker/checks/webrtc.js +70 -15
  23. package/esm/domain/AdHocAPIConference.js +44 -5
  24. package/esm/domain/Features.js +44 -5
  25. package/esm/domain/Meeting.js +14 -1
  26. package/esm/domain/Phone/CTIPhone.js +44 -5
  27. package/esm/domain/Phone/WebRTCPhone.js +32 -3
  28. package/esm/index.js +85 -16
  29. package/esm/lib/WazoSessionDescriptionHandler.js +25 -2
  30. package/esm/service/CallApi.js +44 -5
  31. package/esm/service/IssueReporter.js +25 -2
  32. package/esm/service/__tests__/IssueReporter.test.js +25 -2
  33. package/esm/service/getApiClient.js +44 -5
  34. package/esm/simple/Auth.js +85 -16
  35. package/esm/simple/Configuration.js +85 -16
  36. package/esm/simple/Directory.js +44 -5
  37. package/esm/simple/Phone.js +85 -16
  38. package/esm/simple/Websocket.js +28 -2
  39. package/esm/simple/index.js +85 -16
  40. package/esm/simple/room/LocalParticipant.js +85 -16
  41. package/esm/simple/room/Participant.js +85 -16
  42. package/esm/simple/room/RemoteParticipant.js +85 -16
  43. package/esm/simple/room/Room.js +85 -16
  44. package/esm/simple/room/SipRoom.js +85 -16
  45. package/esm/simple/room/Stream.js +85 -16
  46. package/esm/simple/room/__tests__/RemoteParticipant.test.js +85 -16
  47. package/esm/simple/utils.js +85 -16
  48. package/esm/utils/__tests__/api-requester.test.js +25 -2
  49. package/esm/utils/api-requester.js +25 -2
  50. package/esm/web-rtc-client.js +70 -15
  51. package/esm/websocket-client.js +28 -3
  52. package/lib/__tests__/api-client.test.js +44 -5
  53. package/lib/__tests__/web-rtc-client.test.js +70 -15
  54. package/lib/api/agentd.js +25 -2
  55. package/lib/api/amid.js +25 -2
  56. package/lib/api/application.js +25 -2
  57. package/lib/api/auth.js +25 -2
  58. package/lib/api/call-logd.js +25 -2
  59. package/lib/api/calld.js +25 -2
  60. package/lib/api/chatd.js +25 -2
  61. package/lib/api/confd.js +44 -5
  62. package/lib/api/ctid-ng.js +25 -2
  63. package/lib/api/dird.js +25 -2
  64. package/lib/api/webhookd.js +25 -2
  65. package/lib/api-client.js +44 -5
  66. package/lib/checker/Checker.js +72 -15
  67. package/lib/checker/checks/aor.js +44 -5
  68. package/lib/checker/checks/api.js +44 -5
  69. package/lib/checker/checks/index.js +72 -15
  70. package/lib/checker/checks/wazo-websocket.js +27 -2
  71. package/lib/checker/checks/webrtc-transport.js +70 -15
  72. package/lib/checker/checks/webrtc.js +70 -15
  73. package/lib/domain/AdHocAPIConference.js +44 -5
  74. package/lib/domain/Features.js +44 -5
  75. package/lib/domain/Meeting.js +14 -1
  76. package/lib/domain/Phone/CTIPhone.js +44 -5
  77. package/lib/domain/Phone/WebRTCPhone.js +32 -3
  78. package/lib/index.js +85 -16
  79. package/lib/lib/WazoSessionDescriptionHandler.js +25 -2
  80. package/lib/service/CallApi.js +44 -5
  81. package/lib/service/IssueReporter.js +25 -2
  82. package/lib/service/__tests__/IssueReporter.test.js +25 -2
  83. package/lib/service/getApiClient.js +44 -5
  84. package/lib/simple/Auth.js +85 -16
  85. package/lib/simple/Configuration.js +85 -16
  86. package/lib/simple/Directory.js +44 -5
  87. package/lib/simple/Phone.js +85 -16
  88. package/lib/simple/Websocket.js +28 -2
  89. package/lib/simple/index.js +85 -16
  90. package/lib/simple/room/LocalParticipant.js +85 -16
  91. package/lib/simple/room/Participant.js +85 -16
  92. package/lib/simple/room/RemoteParticipant.js +85 -16
  93. package/lib/simple/room/Room.js +85 -16
  94. package/lib/simple/room/SipRoom.js +85 -16
  95. package/lib/simple/room/Stream.js +85 -16
  96. package/lib/simple/room/__tests__/RemoteParticipant.test.js +85 -16
  97. package/lib/simple/utils.js +85 -16
  98. package/lib/utils/__tests__/api-requester.test.js +25 -2
  99. package/lib/utils/api-requester.js +25 -2
  100. package/lib/web-rtc-client.js +70 -15
  101. package/lib/websocket-client.js +28 -2
  102. package/package.json +1 -1
  103. package/src/api/confd.js +5 -2
  104. package/src/domain/Meeting.js +14 -1
  105. package/src/domain/Phone/WebRTCPhone.js +7 -1
  106. package/src/service/IssueReporter.js +25 -2
  107. package/src/simple/Phone.js +5 -0
  108. package/src/types/WebSocketMessage.js +5 -1
  109. package/src/web-rtc-client.js +26 -10
  110. package/src/websocket-client.js +2 -0
@@ -450,6 +450,7 @@ class IssueReporter {
450
450
 
451
451
 
452
452
 
453
+
453
454
 
454
455
  constructor() {
455
456
  addLevelsTo(this);
@@ -461,12 +462,17 @@ class IssueReporter {
461
462
  this.bufferTimeout = null;
462
463
  this._boundProcessBuffer = this._processBuffer.bind(this);
463
464
  this._boundParseLoggerBody = this._parseLoggerBody.bind(this);
465
+ this._callback = null;
464
466
  }
465
467
 
466
468
  init() {
467
469
  this._catchConsole();
468
470
  }
469
471
 
472
+ setCallback(cb ) {
473
+ this._callback = cb;
474
+ }
475
+
470
476
  configureRemoteClient(configuration = { tag: 'wazo-sdk', host: null, port: null, level: null, extra: {} }) {
471
477
  this.remoteClientConfiguration = configuration;
472
478
  }
@@ -502,6 +508,7 @@ class IssueReporter {
502
508
 
503
509
  // Handle category label
504
510
  let category = null;
511
+ let skipSendToRemote = false;
505
512
  let extra = {};
506
513
  if (args[0].indexOf(CATEGORY_PREFIX) === 0) {
507
514
  category = args[0].split('=')[1];
@@ -517,6 +524,7 @@ class IssueReporter {
517
524
  errorMessage: lastArg.message,
518
525
  errorStack: lastArg.stack,
519
526
  errorType: lastArg.constructor.name,
527
+ skipSendToRemote: lastArg.skipSendToRemote,
520
528
  };
521
529
  } else {
522
530
  extra = lastArg;
@@ -525,6 +533,11 @@ class IssueReporter {
525
533
  args.splice(1, 1);
526
534
  }
527
535
 
536
+ if (extra.skipSendToRemote) {
537
+ skipSendToRemote = true;
538
+ delete extra.skipSendToRemote;
539
+ }
540
+
528
541
  const date = moment__default['default']().format('YYYY-MM-DD HH:mm:ss.SSS');
529
542
  const message = args.join(', ');
530
543
  let consoleMessage = message;
@@ -545,7 +558,13 @@ class IssueReporter {
545
558
  const oldMethod = this.oldConsoleMethods[consoleLevel] || this.oldConsoleMethods.log;
546
559
  oldMethod.apply(oldMethod, [date, consoleMessage]);
547
560
 
548
- this._sendToRemoteLogger(level, { date, message, category, ...extra });
561
+ if (this._callback) {
562
+ this._callback(level, consoleMessage);
563
+ }
564
+
565
+ if (!skipSendToRemote) {
566
+ this._sendToRemoteLogger(level, { date, message, category, ...extra });
567
+ }
549
568
  }
550
569
 
551
570
  logRequest(url , options , response , start ) {
@@ -690,7 +709,11 @@ class IssueReporter {
690
709
  },
691
710
  // $FlowFixMe
692
711
  body,
693
- }).catch(() => {
712
+ }).catch((e ) => {
713
+ // $FlowFixMe
714
+ e.skipSendToRemote = true;
715
+ this.log('error', this._makeCategory('grafana'), 'Sending log to grafana, error', e);
716
+
694
717
  setTimeout(() => {
695
718
  if (isArray) {
696
719
  payload = payload.map(message => {
@@ -2669,11 +2692,24 @@ class Meeting {
2669
2692
  });
2670
2693
  }
2671
2694
 
2695
+ static parseMany(items ) {
2696
+ return items.map(plain => Meeting.parse(plain));
2697
+ }
2698
+
2672
2699
  static newFrom(meeting ) {
2673
2700
  return newFrom(meeting, Meeting);
2674
2701
  }
2675
2702
 
2676
- constructor({ uuid, name, guestSipAuthorization, ownerUuids, port, uri, number, persistent } = {}) {
2703
+ constructor({
2704
+ uuid,
2705
+ name,
2706
+ guestSipAuthorization,
2707
+ ownerUuids,
2708
+ port,
2709
+ uri,
2710
+ number,
2711
+ persistent,
2712
+ } = {}) {
2677
2713
  this.guestSipAuthorization = guestSipAuthorization;
2678
2714
  this.uri = uri;
2679
2715
  this.name = name;
@@ -2759,8 +2795,11 @@ var confdMethods = (client , baseUrl ) => ({
2759
2795
  }
2760
2796
  },
2761
2797
 
2762
- createMyMeeting: (name ) =>
2763
- client.post(`${baseUrl}/users/me/meetings`, { name }).then(Meeting.parse),
2798
+ getMyMeetings: () =>
2799
+ client.get(`${baseUrl}/users/me/meetings`).then(response => Meeting.parseMany(response.items)),
2800
+
2801
+ createMyMeeting: (name , persistent ) =>
2802
+ client.post(`${baseUrl}/users/me/meetings`, { name, persistent }).then(Meeting.parse),
2764
2803
 
2765
2804
  deleteMyMeeting: (meetingUuid ) =>
2766
2805
  client.delete(`${baseUrl}/users/me/meetings/${meetingUuid}`, null),
@@ -6970,7 +7009,9 @@ class WebRTCClient extends Emitter {
6970
7009
  const inviteOptions = {
6971
7010
  requestDelegate: {
6972
7011
  onAccept: (response ) => {
6973
- session.sessionDescriptionHandler.peerConnection.sfu = conference;
7012
+ if (session.sessionDescriptionHandler.peerConnection) {
7013
+ session.sessionDescriptionHandler.peerConnection.sfu = conference;
7014
+ }
6974
7015
  this._onAccepted(session, response.session, true);
6975
7016
  },
6976
7017
  onReject: (response ) => {
@@ -7842,6 +7883,16 @@ class WebRTCClient extends Emitter {
7842
7883
  return this.hasRemoteVideo(sessionId) ? this.getRemoteStream(sessionId) : null;
7843
7884
  }
7844
7885
 
7886
+ // Useful in a react-native environment when remoteMediaStream is not updated
7887
+ getRemoteVideoStreamFromPc(sessionId ) {
7888
+ const pc = this.getPeerConnection(sessionId);
7889
+ if (!pc) {
7890
+ return null;
7891
+ }
7892
+
7893
+ return pc.getRemoteStreams().find(stream => !!stream.getVideoTracks().length);
7894
+ }
7895
+
7845
7896
  hasVideo(sessionId ) {
7846
7897
  return this.hasLocalVideo(sessionId) || this.hasRemoteVideo(sessionId);
7847
7898
  }
@@ -8620,18 +8671,22 @@ class WebRTCClient extends Emitter {
8620
8671
  });
8621
8672
 
8622
8673
  networkStats.packetsLost = packetsLost;
8623
- networkStats.audioBytesSent = audioBytesSent;
8674
+ networkStats.totalAudioBytesSent = audioBytesSent;
8675
+ networkStats.audioBytesSent = audioBytesSent - lastAudioSent;
8676
+ networkStats.totalAudioBytesReceived = audioBytesReceived - lastAudioReceived;
8624
8677
  networkStats.audioBytesReceived = audioBytesReceived;
8625
- networkStats.videoBytesSent = videoBytesSent;
8626
- networkStats.videoBytesReceived = videoBytesReceived;
8678
+ networkStats.totalVideoBytesSent = videoBytesSent;
8679
+ networkStats.videoBytesSent = videoBytesSent - lastVideoSent;
8680
+ networkStats.totalVideoBytesReceived = videoBytesReceived;
8681
+ networkStats.videoBytesReceived = videoBytesReceived - lastVideoReceived;
8682
+ networkStats.totalTransportSent = transportSent - lastTransportSent;
8627
8683
  networkStats.transportSent = transportSent;
8628
- networkStats.transportReceived = transportReceived;
8684
+ networkStats.totalTransportReceived = transportReceived;
8685
+ networkStats.transportReceived = transportReceived - lastTransportReceived;
8629
8686
 
8630
- const bandwidth = (networkStats.audioBytesSent - lastAudioSent) + (networkStats.videoBytesSent - lastVideoSent)
8631
- + (networkStats.audioBytesReceived - lastAudioReceived) + (networkStats.videoBytesReceived - lastVideoReceived)
8632
- + (networkStats.transportReceived - lastTransportReceived) + (networkStats.transportSent - lastTransportSent);
8633
-
8634
- networkStats.bandwidth = bandwidth;
8687
+ networkStats.bandwidth = networkStats.audioBytesSent + networkStats.audioBytesReceived
8688
+ + networkStats.videoBytesSent + networkStats.videoBytesReceived + networkStats.transportReceived
8689
+ + networkStats.transportSent;
8635
8690
 
8636
8691
  this.eventEmitter.emit(ON_NETWORK_STATS$1, session, networkStats, this.sessionNetworkStats[sessionId]);
8637
8692
  this.sessionNetworkStats[sessionId].push(networkStats);
@@ -9042,9 +9097,11 @@ class WebRTCPhone extends Emitter {
9042
9097
  case sessionState.SessionState.Terminated: {
9043
9098
  logger$7.info('WebRTC phone - call terminated', { sipId: sipSession.id });
9044
9099
 
9100
+ // Should be called before `_onCallTerminated` or the callCount will not decrement...
9101
+ const callSession = this._createCallSession(sipSession);
9045
9102
  const wasCurrentSession = this._onCallTerminated(sipSession);
9046
9103
 
9047
- return this.eventEmitter.emit(ON_CALL_ENDED, this._createCallSession(sipSession), wasCurrentSession);
9104
+ return this.eventEmitter.emit(ON_CALL_ENDED, callSession, wasCurrentSession);
9048
9105
  }
9049
9106
  }
9050
9107
  });
@@ -9992,6 +10049,10 @@ class WebRTCPhone extends Emitter {
9992
10049
  return callSession ? this.client.getRemoteVideoStream(callSession.sipCallId) : null;
9993
10050
  }
9994
10051
 
10052
+ getRemoteVideoStreamFromPc(callSession ) {
10053
+ return callSession ? this.client.getRemoteVideoStreamFromPc(callSession.sipCallId) : null;
10054
+ }
10055
+
9995
10056
  hasRemoteVideo(callSession ) {
9996
10057
  return callSession ? this.client.hasRemoteVideo(callSession.sipCallId) : false;
9997
10058
  }
@@ -10675,6 +10736,11 @@ class Phone extends Emitter {
10675
10736
  return this.getRemoteVideoStream(callSession);
10676
10737
  }
10677
10738
 
10739
+ // Useful in a react-native environment when remoteMediaStream is not updated
10740
+ getRemoteVideoStreamFromPc(callSession ) {
10741
+ return this.phone ? this.phone.getRemoteVideoStreamFromPc(callSession) : false;
10742
+ }
10743
+
10678
10744
  hasVideo(callSession ) {
10679
10745
  return this.phone ? this.phone.hasVideo(callSession) : false;
10680
10746
  }
@@ -10834,6 +10900,7 @@ const AGENT_PAUSED = 'agent_paused';
10834
10900
  const AGENT_UNPAUSED = 'agent_unpaused';
10835
10901
  const CONFERENCE_ADHOC_PARTICIPANT_LEFT = 'conference_adhoc_participant_left';
10836
10902
  const CONFERENCE_ADHOC_DELETED = 'conference_adhoc_deleted';
10903
+ const MEETING_USER_PROGRESS = 'meeting_user_progress';
10837
10904
 
10838
10905
  const BLACKLIST_EVENTS = [
10839
10906
  CHAT_MESSAGE_SENT,
@@ -11184,6 +11251,7 @@ WebSocketClient.eventLists = [
11184
11251
  AGENT_UNPAUSED,
11185
11252
  CONFERENCE_ADHOC_PARTICIPANT_LEFT,
11186
11253
  CONFERENCE_ADHOC_DELETED,
11254
+ MEETING_USER_PROGRESS,
11187
11255
  ];
11188
11256
 
11189
11257
  var WebSocketClient$1 = /*#__PURE__*/Object.freeze({
@@ -11254,6 +11322,7 @@ var WebSocketClient$1 = /*#__PURE__*/Object.freeze({
11254
11322
  AGENT_UNPAUSED: AGENT_UNPAUSED,
11255
11323
  CONFERENCE_ADHOC_PARTICIPANT_LEFT: CONFERENCE_ADHOC_PARTICIPANT_LEFT,
11256
11324
  CONFERENCE_ADHOC_DELETED: CONFERENCE_ADHOC_DELETED,
11325
+ MEETING_USER_PROGRESS: MEETING_USER_PROGRESS,
11257
11326
  HEARTBEAT_ENGINE_VERSION: HEARTBEAT_ENGINE_VERSION,
11258
11327
  'default': WebSocketClient
11259
11328
  });
@@ -159,6 +159,7 @@ class IssueReporter {
159
159
 
160
160
 
161
161
 
162
+
162
163
 
163
164
  constructor() {
164
165
  addLevelsTo(this);
@@ -170,12 +171,17 @@ class IssueReporter {
170
171
  this.bufferTimeout = null;
171
172
  this._boundProcessBuffer = this._processBuffer.bind(this);
172
173
  this._boundParseLoggerBody = this._parseLoggerBody.bind(this);
174
+ this._callback = null;
173
175
  }
174
176
 
175
177
  init() {
176
178
  this._catchConsole();
177
179
  }
178
180
 
181
+ setCallback(cb ) {
182
+ this._callback = cb;
183
+ }
184
+
179
185
  configureRemoteClient(configuration = { tag: 'wazo-sdk', host: null, port: null, level: null, extra: {} }) {
180
186
  this.remoteClientConfiguration = configuration;
181
187
  }
@@ -211,6 +217,7 @@ class IssueReporter {
211
217
 
212
218
  // Handle category label
213
219
  let category = null;
220
+ let skipSendToRemote = false;
214
221
  let extra = {};
215
222
  if (args[0].indexOf(CATEGORY_PREFIX) === 0) {
216
223
  category = args[0].split('=')[1];
@@ -226,6 +233,7 @@ class IssueReporter {
226
233
  errorMessage: lastArg.message,
227
234
  errorStack: lastArg.stack,
228
235
  errorType: lastArg.constructor.name,
236
+ skipSendToRemote: lastArg.skipSendToRemote,
229
237
  };
230
238
  } else {
231
239
  extra = lastArg;
@@ -234,6 +242,11 @@ class IssueReporter {
234
242
  args.splice(1, 1);
235
243
  }
236
244
 
245
+ if (extra.skipSendToRemote) {
246
+ skipSendToRemote = true;
247
+ delete extra.skipSendToRemote;
248
+ }
249
+
237
250
  const date = moment__default['default']().format('YYYY-MM-DD HH:mm:ss.SSS');
238
251
  const message = args.join(', ');
239
252
  let consoleMessage = message;
@@ -254,7 +267,13 @@ class IssueReporter {
254
267
  const oldMethod = this.oldConsoleMethods[consoleLevel] || this.oldConsoleMethods.log;
255
268
  oldMethod.apply(oldMethod, [date, consoleMessage]);
256
269
 
257
- this._sendToRemoteLogger(level, { date, message, category, ...extra });
270
+ if (this._callback) {
271
+ this._callback(level, consoleMessage);
272
+ }
273
+
274
+ if (!skipSendToRemote) {
275
+ this._sendToRemoteLogger(level, { date, message, category, ...extra });
276
+ }
258
277
  }
259
278
 
260
279
  logRequest(url , options , response , start ) {
@@ -399,7 +418,11 @@ class IssueReporter {
399
418
  },
400
419
  // $FlowFixMe
401
420
  body,
402
- }).catch(() => {
421
+ }).catch((e ) => {
422
+ // $FlowFixMe
423
+ e.skipSendToRemote = true;
424
+ this.log('error', this._makeCategory('grafana'), 'Sending log to grafana, error', e);
425
+
403
426
  setTimeout(() => {
404
427
  if (isArray) {
405
428
  payload = payload.map(message => {
@@ -2643,11 +2666,24 @@ class Meeting {
2643
2666
  });
2644
2667
  }
2645
2668
 
2669
+ static parseMany(items ) {
2670
+ return items.map(plain => Meeting.parse(plain));
2671
+ }
2672
+
2646
2673
  static newFrom(meeting ) {
2647
2674
  return newFrom(meeting, Meeting);
2648
2675
  }
2649
2676
 
2650
- constructor({ uuid, name, guestSipAuthorization, ownerUuids, port, uri, number, persistent } = {}) {
2677
+ constructor({
2678
+ uuid,
2679
+ name,
2680
+ guestSipAuthorization,
2681
+ ownerUuids,
2682
+ port,
2683
+ uri,
2684
+ number,
2685
+ persistent,
2686
+ } = {}) {
2651
2687
  this.guestSipAuthorization = guestSipAuthorization;
2652
2688
  this.uri = uri;
2653
2689
  this.name = name;
@@ -2733,8 +2769,11 @@ var confdMethods = (client , baseUrl ) => ({
2733
2769
  }
2734
2770
  },
2735
2771
 
2736
- createMyMeeting: (name ) =>
2737
- client.post(`${baseUrl}/users/me/meetings`, { name }).then(Meeting.parse),
2772
+ getMyMeetings: () =>
2773
+ client.get(`${baseUrl}/users/me/meetings`).then(response => Meeting.parseMany(response.items)),
2774
+
2775
+ createMyMeeting: (name , persistent ) =>
2776
+ client.post(`${baseUrl}/users/me/meetings`, { name, persistent }).then(Meeting.parse),
2738
2777
 
2739
2778
  deleteMyMeeting: (meetingUuid ) =>
2740
2779
  client.delete(`${baseUrl}/users/me/meetings/${meetingUuid}`, null),
@@ -6970,7 +7009,9 @@ class WebRTCClient extends Emitter {
6970
7009
  const inviteOptions = {
6971
7010
  requestDelegate: {
6972
7011
  onAccept: (response ) => {
6973
- session.sessionDescriptionHandler.peerConnection.sfu = conference;
7012
+ if (session.sessionDescriptionHandler.peerConnection) {
7013
+ session.sessionDescriptionHandler.peerConnection.sfu = conference;
7014
+ }
6974
7015
  this._onAccepted(session, response.session, true);
6975
7016
  },
6976
7017
  onReject: (response ) => {
@@ -7842,6 +7883,16 @@ class WebRTCClient extends Emitter {
7842
7883
  return this.hasRemoteVideo(sessionId) ? this.getRemoteStream(sessionId) : null;
7843
7884
  }
7844
7885
 
7886
+ // Useful in a react-native environment when remoteMediaStream is not updated
7887
+ getRemoteVideoStreamFromPc(sessionId ) {
7888
+ const pc = this.getPeerConnection(sessionId);
7889
+ if (!pc) {
7890
+ return null;
7891
+ }
7892
+
7893
+ return pc.getRemoteStreams().find(stream => !!stream.getVideoTracks().length);
7894
+ }
7895
+
7845
7896
  hasVideo(sessionId ) {
7846
7897
  return this.hasLocalVideo(sessionId) || this.hasRemoteVideo(sessionId);
7847
7898
  }
@@ -8620,18 +8671,22 @@ class WebRTCClient extends Emitter {
8620
8671
  });
8621
8672
 
8622
8673
  networkStats.packetsLost = packetsLost;
8623
- networkStats.audioBytesSent = audioBytesSent;
8674
+ networkStats.totalAudioBytesSent = audioBytesSent;
8675
+ networkStats.audioBytesSent = audioBytesSent - lastAudioSent;
8676
+ networkStats.totalAudioBytesReceived = audioBytesReceived - lastAudioReceived;
8624
8677
  networkStats.audioBytesReceived = audioBytesReceived;
8625
- networkStats.videoBytesSent = videoBytesSent;
8626
- networkStats.videoBytesReceived = videoBytesReceived;
8678
+ networkStats.totalVideoBytesSent = videoBytesSent;
8679
+ networkStats.videoBytesSent = videoBytesSent - lastVideoSent;
8680
+ networkStats.totalVideoBytesReceived = videoBytesReceived;
8681
+ networkStats.videoBytesReceived = videoBytesReceived - lastVideoReceived;
8682
+ networkStats.totalTransportSent = transportSent - lastTransportSent;
8627
8683
  networkStats.transportSent = transportSent;
8628
- networkStats.transportReceived = transportReceived;
8684
+ networkStats.totalTransportReceived = transportReceived;
8685
+ networkStats.transportReceived = transportReceived - lastTransportReceived;
8629
8686
 
8630
- const bandwidth = (networkStats.audioBytesSent - lastAudioSent) + (networkStats.videoBytesSent - lastVideoSent)
8631
- + (networkStats.audioBytesReceived - lastAudioReceived) + (networkStats.videoBytesReceived - lastVideoReceived)
8632
- + (networkStats.transportReceived - lastTransportReceived) + (networkStats.transportSent - lastTransportSent);
8633
-
8634
- networkStats.bandwidth = bandwidth;
8687
+ networkStats.bandwidth = networkStats.audioBytesSent + networkStats.audioBytesReceived
8688
+ + networkStats.videoBytesSent + networkStats.videoBytesReceived + networkStats.transportReceived
8689
+ + networkStats.transportSent;
8635
8690
 
8636
8691
  this.eventEmitter.emit(ON_NETWORK_STATS$1, session, networkStats, this.sessionNetworkStats[sessionId]);
8637
8692
  this.sessionNetworkStats[sessionId].push(networkStats);
@@ -9042,9 +9097,11 @@ class WebRTCPhone extends Emitter {
9042
9097
  case sessionState.SessionState.Terminated: {
9043
9098
  logger$7.info('WebRTC phone - call terminated', { sipId: sipSession.id });
9044
9099
 
9100
+ // Should be called before `_onCallTerminated` or the callCount will not decrement...
9101
+ const callSession = this._createCallSession(sipSession);
9045
9102
  const wasCurrentSession = this._onCallTerminated(sipSession);
9046
9103
 
9047
- return this.eventEmitter.emit(ON_CALL_ENDED, this._createCallSession(sipSession), wasCurrentSession);
9104
+ return this.eventEmitter.emit(ON_CALL_ENDED, callSession, wasCurrentSession);
9048
9105
  }
9049
9106
  }
9050
9107
  });
@@ -9992,6 +10049,10 @@ class WebRTCPhone extends Emitter {
9992
10049
  return callSession ? this.client.getRemoteVideoStream(callSession.sipCallId) : null;
9993
10050
  }
9994
10051
 
10052
+ getRemoteVideoStreamFromPc(callSession ) {
10053
+ return callSession ? this.client.getRemoteVideoStreamFromPc(callSession.sipCallId) : null;
10054
+ }
10055
+
9995
10056
  hasRemoteVideo(callSession ) {
9996
10057
  return callSession ? this.client.hasRemoteVideo(callSession.sipCallId) : false;
9997
10058
  }
@@ -10675,6 +10736,11 @@ class Phone extends Emitter {
10675
10736
  return this.getRemoteVideoStream(callSession);
10676
10737
  }
10677
10738
 
10739
+ // Useful in a react-native environment when remoteMediaStream is not updated
10740
+ getRemoteVideoStreamFromPc(callSession ) {
10741
+ return this.phone ? this.phone.getRemoteVideoStreamFromPc(callSession) : false;
10742
+ }
10743
+
10678
10744
  hasVideo(callSession ) {
10679
10745
  return this.phone ? this.phone.hasVideo(callSession) : false;
10680
10746
  }
@@ -10834,6 +10900,7 @@ const AGENT_PAUSED = 'agent_paused';
10834
10900
  const AGENT_UNPAUSED = 'agent_unpaused';
10835
10901
  const CONFERENCE_ADHOC_PARTICIPANT_LEFT = 'conference_adhoc_participant_left';
10836
10902
  const CONFERENCE_ADHOC_DELETED = 'conference_adhoc_deleted';
10903
+ const MEETING_USER_PROGRESS = 'meeting_user_progress';
10837
10904
 
10838
10905
  const BLACKLIST_EVENTS = [
10839
10906
  CHAT_MESSAGE_SENT,
@@ -11184,6 +11251,7 @@ WebSocketClient.eventLists = [
11184
11251
  AGENT_UNPAUSED,
11185
11252
  CONFERENCE_ADHOC_PARTICIPANT_LEFT,
11186
11253
  CONFERENCE_ADHOC_DELETED,
11254
+ MEETING_USER_PROGRESS,
11187
11255
  ];
11188
11256
 
11189
11257
  var WebSocketClient$1 = /*#__PURE__*/Object.freeze({
@@ -11254,6 +11322,7 @@ var WebSocketClient$1 = /*#__PURE__*/Object.freeze({
11254
11322
  AGENT_UNPAUSED: AGENT_UNPAUSED,
11255
11323
  CONFERENCE_ADHOC_PARTICIPANT_LEFT: CONFERENCE_ADHOC_PARTICIPANT_LEFT,
11256
11324
  CONFERENCE_ADHOC_DELETED: CONFERENCE_ADHOC_DELETED,
11325
+ MEETING_USER_PROGRESS: MEETING_USER_PROGRESS,
11257
11326
  HEARTBEAT_ENGINE_VERSION: HEARTBEAT_ENGINE_VERSION,
11258
11327
  'default': WebSocketClient
11259
11328
  });