@wazo/sdk 0.37.24 → 0.37.25

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 (94) hide show
  1. package/dist/wazo-sdk.js +6 -6
  2. package/esm/__tests__/api-client.test.js +12 -12
  3. package/esm/__tests__/web-rtc-client.test.js +120 -103
  4. package/esm/api/amid.js +1 -1
  5. package/esm/api/call-logd.js +2 -2
  6. package/esm/api/ctid-ng.js +3 -3
  7. package/esm/api/dird.js +1 -1
  8. package/esm/api/webhookd.js +1 -1
  9. package/esm/api-client.js +12 -12
  10. package/esm/checker/Checker.js +145 -128
  11. package/esm/checker/checks/aor.js +12 -12
  12. package/esm/checker/checks/api.js +12 -12
  13. package/esm/checker/checks/index.js +135 -118
  14. package/esm/checker/checks/wazo-websocket.js +15 -15
  15. package/esm/checker/checks/webrtc-transport.js +120 -103
  16. package/esm/checker/checks/webrtc.js +120 -103
  17. package/esm/domain/AdHocAPIConference.js +12 -12
  18. package/esm/domain/CallLog.js +1 -1
  19. package/esm/domain/Contact.js +1 -1
  20. package/esm/domain/Features.js +12 -12
  21. package/esm/domain/Phone/CTIPhone.js +26 -26
  22. package/esm/domain/Phone/WebRTCPhone.js +87 -86
  23. package/esm/domain/__tests__/CallLog.test.js +1 -1
  24. package/esm/domain/__tests__/Contact.test.js +1 -1
  25. package/esm/index.js +356 -338
  26. package/esm/lib/WazoSessionDescriptionHandler.js +1 -1
  27. package/esm/service/CallApi.js +12 -12
  28. package/esm/service/IssueReporter.js +1 -1
  29. package/esm/service/__tests__/IssueReporter.test.js +1 -1
  30. package/esm/service/getApiClient.js +12 -12
  31. package/esm/simple/Auth.js +346 -328
  32. package/esm/simple/Configuration.js +346 -328
  33. package/esm/simple/Directory.js +12 -12
  34. package/esm/simple/Phone.js +346 -328
  35. package/esm/simple/Websocket.js +17 -17
  36. package/esm/simple/index.js +350 -332
  37. package/esm/simple/room/LocalParticipant.js +350 -332
  38. package/esm/simple/room/Participant.js +350 -332
  39. package/esm/simple/room/RemoteParticipant.js +350 -332
  40. package/esm/simple/room/Room.js +351 -333
  41. package/esm/simple/room/SipRoom.js +350 -332
  42. package/esm/simple/room/Stream.js +350 -332
  43. package/esm/simple/room/__tests__/RemoteParticipant.test.js +350 -332
  44. package/esm/simple/utils.js +350 -332
  45. package/esm/web-rtc-client.js +120 -103
  46. package/esm/websocket-client.js +15 -15
  47. package/lib/__tests__/api-client.test.js +12 -12
  48. package/lib/__tests__/web-rtc-client.test.js +120 -103
  49. package/lib/api/amid.js +1 -1
  50. package/lib/api/call-logd.js +2 -2
  51. package/lib/api/ctid-ng.js +3 -3
  52. package/lib/api/dird.js +1 -1
  53. package/lib/api/webhookd.js +1 -1
  54. package/lib/api-client.js +12 -12
  55. package/lib/checker/Checker.js +145 -128
  56. package/lib/checker/checks/aor.js +12 -12
  57. package/lib/checker/checks/api.js +12 -12
  58. package/lib/checker/checks/index.js +135 -118
  59. package/lib/checker/checks/wazo-websocket.js +15 -15
  60. package/lib/checker/checks/webrtc-transport.js +120 -103
  61. package/lib/checker/checks/webrtc.js +120 -103
  62. package/lib/domain/AdHocAPIConference.js +12 -12
  63. package/lib/domain/CallLog.js +1 -1
  64. package/lib/domain/Contact.js +1 -1
  65. package/lib/domain/Features.js +12 -12
  66. package/lib/domain/Phone/CTIPhone.js +26 -26
  67. package/lib/domain/Phone/WebRTCPhone.js +87 -86
  68. package/lib/domain/__tests__/CallLog.test.js +1 -1
  69. package/lib/domain/__tests__/Contact.test.js +1 -1
  70. package/lib/index.js +356 -338
  71. package/lib/lib/WazoSessionDescriptionHandler.js +1 -1
  72. package/lib/service/CallApi.js +12 -12
  73. package/lib/service/IssueReporter.js +1 -1
  74. package/lib/service/__tests__/IssueReporter.test.js +1 -1
  75. package/lib/service/getApiClient.js +12 -12
  76. package/lib/simple/Auth.js +346 -328
  77. package/lib/simple/Configuration.js +346 -328
  78. package/lib/simple/Directory.js +12 -12
  79. package/lib/simple/Phone.js +346 -328
  80. package/lib/simple/Websocket.js +17 -17
  81. package/lib/simple/index.js +350 -332
  82. package/lib/simple/room/LocalParticipant.js +350 -332
  83. package/lib/simple/room/Participant.js +350 -332
  84. package/lib/simple/room/RemoteParticipant.js +350 -332
  85. package/lib/simple/room/Room.js +351 -333
  86. package/lib/simple/room/SipRoom.js +350 -332
  87. package/lib/simple/room/Stream.js +350 -332
  88. package/lib/simple/room/__tests__/RemoteParticipant.test.js +350 -332
  89. package/lib/simple/utils.js +350 -332
  90. package/lib/web-rtc-client.js +120 -103
  91. package/lib/websocket-client.js +15 -15
  92. package/package.json +1 -1
  93. package/src/domain/Phone/WebRTCPhone.js +3 -2
  94. package/src/web-rtc-client.js +27 -10
@@ -111,7 +111,7 @@ const isMobile = () => typeof navigator !== 'undefined' && navigator.product ===
111
111
 
112
112
  const methods = ['head', 'get', 'post', 'put', 'delete'];
113
113
 
114
- const logger = IssueReporter$1 ? IssueReporter$1.loggerFor('api') : console;
114
+ const logger$2 = IssueReporter$1 ? IssueReporter$1.loggerFor('api') : console;
115
115
 
116
116
  // Use a function here to be able to mock it in tests
117
117
  const realFetch = () => {
@@ -250,7 +250,7 @@ class ApiRequester {
250
250
  };
251
251
 
252
252
  if (this.refreshTokenPromise) {
253
- logger.info('A token is already refreshing, waiting ...', { url });
253
+ logger$2.info('A token is already refreshing, waiting ...', { url });
254
254
  await this.refreshTokenPromise;
255
255
  }
256
256
 
@@ -270,7 +270,7 @@ class ApiRequester {
270
270
  return promise.then(async (err ) => {
271
271
  // Check if the token is still valid
272
272
  if (firstCall && this._checkTokenExpired(response, err)) {
273
- logger.warn('token expired', { error: err.reason });
273
+ logger$2.warn('token expired', { error: err.reason });
274
274
  // Replay the call after refreshing the token
275
275
  return this._replayWithNewToken(err, path, method, body, headers, parse);
276
276
  }
@@ -280,7 +280,7 @@ class ApiRequester {
280
280
  : exceptionClass.fromResponse(err, response.status);
281
281
 
282
282
  if (this.shouldLogErrors) {
283
- logger.error('API error', error);
283
+ logger$2.error('API error', error);
284
284
  }
285
285
 
286
286
  throw error;
@@ -290,7 +290,7 @@ class ApiRequester {
290
290
  return newParse(response, isJson);
291
291
  }).catch(error => {
292
292
  if (this.shouldLogErrors) {
293
- logger.error('Fetch failed', { url, options, message: error.message, stack: error.stack });
293
+ logger$2.error('Fetch failed', { url, options, message: error.message, stack: error.stack });
294
294
  }
295
295
 
296
296
  throw error;
@@ -318,13 +318,13 @@ class ApiRequester {
318
318
  ) {
319
319
  const isTokenNotFound = this._isTokenNotFound(err);
320
320
  let newPath = path;
321
- logger.info('refreshing token', { inProgress: !!this.refreshTokenPromise });
321
+ logger$2.info('refreshing token', { inProgress: !!this.refreshTokenPromise });
322
322
 
323
323
  this.refreshTokenPromise = this.refreshTokenPromise || this.refreshTokenCallback();
324
324
 
325
325
  return this.refreshTokenPromise.then(() => {
326
326
  this.refreshTokenPromise = null;
327
- logger.info('token refreshed', { isTokenNotFound });
327
+ logger$2.info('token refreshed', { isTokenNotFound });
328
328
  if (isTokenNotFound) {
329
329
  const pathParts = path.split('/');
330
330
  pathParts.pop();
@@ -4149,7 +4149,7 @@ const TRANSFER_FLOW_BLIND = 'blind';
4149
4149
 
4150
4150
  // const MINIMUM_WAZO_ENGINE_VERSION_FOR_CTI_HOLD = '20.11';
4151
4151
 
4152
- const logger$1 = IssueReporter$1 ? IssueReporter$1.loggerFor('cti-phone') : console;
4152
+ IssueReporter$1 ? IssueReporter$1.loggerFor('cti-phone') : console;
4153
4153
 
4154
4154
  /* */
4155
4155
 
@@ -5068,7 +5068,7 @@ const AGENTD_VERSION = '1.0';
5068
5068
  const WEBHOOKD_VERSION = '1.0';
5069
5069
  const AMID_VERSION = '1.0';
5070
5070
 
5071
- const logger$2 = IssueReporter$1 ? IssueReporter$1.loggerFor('api') : console;
5071
+ const logger$1 = IssueReporter$1 ? IssueReporter$1.loggerFor('api') : console;
5072
5072
 
5073
5073
  class ApiClient {
5074
5074
 
@@ -5120,12 +5120,12 @@ class ApiClient {
5120
5120
  }
5121
5121
 
5122
5122
  async forceRefreshToken() {
5123
- logger$2.info('forcing refresh token, calling callback');
5123
+ logger$1.info('forcing refresh token, calling callback');
5124
5124
  return this.refreshTokenCallback();
5125
5125
  }
5126
5126
 
5127
5127
  async refreshTokenCallback() {
5128
- logger$2.info('refresh token callback called', {
5128
+ logger$1.info('refresh token callback called', {
5129
5129
  refreshToken: this.refreshToken,
5130
5130
  refreshBackend: this.refreshBackend,
5131
5131
  refreshExpiration: this.refreshExpiration,
@@ -5143,7 +5143,7 @@ class ApiClient {
5143
5143
  this.isMobile,
5144
5144
  );
5145
5145
 
5146
- logger$2.info('token refreshed', { token: session.token });
5146
+ logger$1.info('token refreshed', { token: session.token });
5147
5147
 
5148
5148
  if (this.onRefreshToken) {
5149
5149
  this.onRefreshToken(session.token, session);
@@ -5316,7 +5316,7 @@ const DEFAULT_ICE_TIMEOUT = 3000;
5316
5316
  const SEND_STATS_DELAY = 5000;
5317
5317
 
5318
5318
  const states = ['STATUS_NULL', 'STATUS_NEW', 'STATUS_CONNECTING', 'STATUS_CONNECTED', 'STATUS_COMPLETED'];
5319
- const logger$3 = IssueReporter$1 ? IssueReporter$1.loggerFor('webrtc-client') : console;
5319
+ const logger = IssueReporter$1 ? IssueReporter$1.loggerFor('webrtc-client') : console;
5320
5320
  const statsLogger = IssueReporter$1 ? IssueReporter$1.loggerFor('webrtc-stats') : console;
5321
5321
 
5322
5322
  // events
@@ -5495,13 +5495,13 @@ class WebRTCClient extends Emitter {
5495
5495
 
5496
5496
  createUserAgent(configOverrides ) {
5497
5497
  const webRTCConfiguration = this._createWebRTCConfiguration(configOverrides);
5498
- logger$3.info('sdk webrtc, creating UA', { webRTCConfiguration });
5498
+ logger.info('sdk webrtc, creating UA', { webRTCConfiguration });
5499
5499
 
5500
5500
  webRTCConfiguration.delegate = {
5501
5501
  onConnect: this.onConnect.bind(this),
5502
5502
  onDisconnect: this.onDisconnect.bind(this),
5503
5503
  onInvite: (invitation ) => {
5504
- logger$3.info('sdk webrtc on invite', {
5504
+ logger.info('sdk webrtc on invite', {
5505
5505
  method: 'delegate.onInvite',
5506
5506
  id: invitation.id,
5507
5507
  remoteURI: invitation.remoteURI,
@@ -5544,7 +5544,7 @@ class WebRTCClient extends Emitter {
5544
5544
  }
5545
5545
 
5546
5546
  onConnect() {
5547
- logger$3.info('sdk webrtc connected', { method: 'delegate.onConnect' });
5547
+ logger.info('sdk webrtc connected', { method: 'delegate.onConnect' });
5548
5548
  this.eventEmitter.emit(CONNECTED);
5549
5549
  if (!this.isRegistered() && this.registerer && this.registerer.waiting) {
5550
5550
  this.registerer.waitingToggle(false);
@@ -5553,7 +5553,7 @@ class WebRTCClient extends Emitter {
5553
5553
  }
5554
5554
 
5555
5555
  async onDisconnect(error ) {
5556
- logger$3.info('sdk webrtc disconnected', { method: 'delegate.onConnect', error });
5556
+ logger.info('sdk webrtc disconnected', { method: 'delegate.onConnect', error });
5557
5557
  this.connectionPromise = null;
5558
5558
  // The UA will attempt to reconnect automatically when an error occurred
5559
5559
  this.eventEmitter.emit(DISCONNECTED, error);
@@ -5578,37 +5578,37 @@ class WebRTCClient extends Emitter {
5578
5578
  };
5579
5579
 
5580
5580
  if (this.skipRegister) {
5581
- logger$3.info('sdk webrtc skip register...', logInfo);
5581
+ logger.info('sdk webrtc skip register...', logInfo);
5582
5582
  return Promise.resolve();
5583
5583
  }
5584
5584
 
5585
- logger$3.info('sdk webrtc registering...', logInfo);
5585
+ logger.info('sdk webrtc registering...', logInfo);
5586
5586
 
5587
5587
  if (!this.userAgent) {
5588
- logger$3.info('sdk webrtc recreating User Agent');
5588
+ logger.info('sdk webrtc recreating User Agent');
5589
5589
  this.userAgent = this.createUserAgent(this.uaConfigOverrides);
5590
5590
  }
5591
5591
  if (!this.userAgent || this.isRegistered()) {
5592
- logger$3.info('sdk webrtc registering aborted, already registered or no UA can be created');
5592
+ logger.info('sdk webrtc registering aborted, already registered or no UA can be created');
5593
5593
  return Promise.resolve();
5594
5594
  }
5595
5595
 
5596
5596
  if (this.connectionPromise || (this.registerer && this.registerer.waiting)) {
5597
- logger$3.info('sdk webrtc registering aborted due to a registration in progress.');
5597
+ logger.info('sdk webrtc registering aborted due to a registration in progress.');
5598
5598
  return Promise.resolve();
5599
5599
  }
5600
5600
 
5601
5601
  const registerOptions = this._isWeb() ? {} : { extraContactHeaderParams: ['mobility=mobile'] };
5602
5602
 
5603
5603
  const onRegisterFailed = () => {
5604
- logger$3.info('sdk webrtc registering failed', { tries, registerer: !!this.registerer });
5604
+ logger.info('sdk webrtc registering failed', { tries, registerer: !!this.registerer });
5605
5605
  this.connectionPromise = null;
5606
5606
  if (this.registerer && this.registerer.waiting) {
5607
5607
  this.registerer.waitingToggle(false);
5608
5608
  }
5609
5609
 
5610
5610
  if (tries <= MAX_REGISTER_TRIES) {
5611
- logger$3.info('sdk webrtc registering, retrying...', { tries });
5611
+ logger.info('sdk webrtc registering, retrying...', { tries });
5612
5612
  setTimeout(() => this.register(tries + 1), 300);
5613
5613
  }
5614
5614
  };
@@ -5617,18 +5617,18 @@ class WebRTCClient extends Emitter {
5617
5617
  // Avoid race condition with the close method called just before register and setting userAgent to null
5618
5618
  // during the resolution of the primise.
5619
5619
  if (!this.userAgent) {
5620
- logger$3.info('sdk webrtc recreating User Agent after connection');
5620
+ logger.info('sdk webrtc recreating User Agent after connection');
5621
5621
  this.userAgent = this.createUserAgent(this.uaConfigOverrides);
5622
5622
  }
5623
5623
 
5624
- logger$3.info('sdk webrtc registering, transport connected', { registerOptions, ua: !!this.userAgent });
5624
+ logger.info('sdk webrtc registering, transport connected', { registerOptions, ua: !!this.userAgent });
5625
5625
  this.registerer = new registerer.Registerer(this.userAgent, registerOptions);
5626
5626
  this.connectionPromise = null;
5627
5627
  this._monkeyPatchRegisterer(this.registerer);
5628
5628
 
5629
5629
  // Bind registerer events
5630
5630
  this.registerer.stateChange.addListener(newState => {
5631
- logger$3.info('sdk webrtc registering, state changed', { newState });
5631
+ logger.info('sdk webrtc registering, state changed', { newState });
5632
5632
 
5633
5633
  if (newState === registererState.RegistererState.Registered && this.registerer
5634
5634
  && this.registerer.state === registererState.RegistererState.Registered) {
@@ -5641,7 +5641,7 @@ class WebRTCClient extends Emitter {
5641
5641
  const options = {
5642
5642
  requestDelegate: {
5643
5643
  onReject: response => {
5644
- logger$3.error('sdk webrtc registering, rejected', { response });
5644
+ logger.error('sdk webrtc registering, rejected', { response });
5645
5645
 
5646
5646
  onRegisterFailed();
5647
5647
  },
@@ -5649,13 +5649,13 @@ class WebRTCClient extends Emitter {
5649
5649
  };
5650
5650
 
5651
5651
  return this.registerer.register(options).catch((e) => {
5652
- logger$3.error('sdk webrtc registering, error', e);
5652
+ logger.error('sdk webrtc registering, error', e);
5653
5653
 
5654
5654
  this.eventEmitter.emit(REGISTRATION_FAILED);
5655
5655
  return e;
5656
5656
  });
5657
5657
  }).catch(error => {
5658
- logger$3.error('sdk webrtc registering, transport error', error);
5658
+ logger.error('sdk webrtc registering, transport error', error);
5659
5659
  onRegisterFailed();
5660
5660
  });
5661
5661
  }
@@ -5684,21 +5684,21 @@ class WebRTCClient extends Emitter {
5684
5684
  }
5685
5685
 
5686
5686
  unregister() {
5687
- logger$3.info('sdk webrtc unregistering..', { userAgent: !!this.userAgent, registerer: !!this.registerer });
5687
+ logger.info('sdk webrtc unregistering..', { userAgent: !!this.userAgent, registerer: !!this.registerer });
5688
5688
  if (!this.registerer) {
5689
5689
  return Promise.resolve();
5690
5690
  }
5691
5691
 
5692
5692
  try {
5693
5693
  return this.registerer.unregister().then(() => {
5694
- logger$3.info('sdk webrtc unregistered');
5694
+ logger.info('sdk webrtc unregistered');
5695
5695
  this._cleanupRegister();
5696
5696
  }).catch(e => {
5697
- logger$3.error('sdk webrtc unregistering, promise error', e);
5697
+ logger.error('sdk webrtc unregistering, promise error', e);
5698
5698
  this._cleanupRegister();
5699
5699
  });
5700
5700
  } catch (e) {
5701
- logger$3.error('sdk webrtc unregistering, error', e);
5701
+ logger.error('sdk webrtc unregistering, error', e);
5702
5702
  // Avoid issue with `undefined is not an object (evaluating 'new.target.prototype')` when triggering a new
5703
5703
  // error when the registerer is in a bad state
5704
5704
  this._cleanupRegister();
@@ -5706,7 +5706,7 @@ class WebRTCClient extends Emitter {
5706
5706
  }
5707
5707
 
5708
5708
  stop() {
5709
- logger$3.info('sdk webrtc stop', { userAgent: !!this.userAgent });
5709
+ logger.info('sdk webrtc stop', { userAgent: !!this.userAgent });
5710
5710
  if (!this.userAgent) {
5711
5711
  return Promise.resolve();
5712
5712
  }
@@ -5714,12 +5714,12 @@ class WebRTCClient extends Emitter {
5714
5714
  return this.userAgent.stop().then(() => {
5715
5715
  return this._cleanupRegister();
5716
5716
  }).catch(e => {
5717
- logger$3.warn('sdk webrtc stop, error', { message: e.message, stack: e.stack });
5717
+ logger.warn('sdk webrtc stop, error', { message: e.message, stack: e.stack });
5718
5718
  });
5719
5719
  }
5720
5720
 
5721
5721
  call(number , enableVideo , audioOnly = false, conference = false) {
5722
- logger$3.info('sdk webrtc creating call', { number, enableVideo, audioOnly });
5722
+ logger.info('sdk webrtc creating call', { number, enableVideo, audioOnly, conference });
5723
5723
  const inviterOptions = {
5724
5724
  sessionDescriptionHandlerOptionsReInvite: {
5725
5725
  conference,
@@ -5750,7 +5750,7 @@ class WebRTCClient extends Emitter {
5750
5750
  this._onAccepted(session, response.session, true);
5751
5751
  },
5752
5752
  onReject: (response ) => {
5753
- logger$3.info('on call rejected', { id: session.id, fromTag: session.fromTag });
5753
+ logger.info('on call rejected', { id: session.id, fromTag: session.fromTag });
5754
5754
  this._stopSendingStats(session);
5755
5755
  this.stopNetworkMonitoring(session);
5756
5756
 
@@ -5773,11 +5773,11 @@ class WebRTCClient extends Emitter {
5773
5773
  }
5774
5774
 
5775
5775
  answer(session , enableVideo ) {
5776
- logger$3.info('sdk webrtc answer call', { id: session.id, enableVideo });
5776
+ logger.info('sdk webrtc answer call', { id: session.id, enableVideo });
5777
5777
 
5778
5778
  if (!session || !session.accept) {
5779
5779
  const error = 'No session to answer, or not an invitation';
5780
- logger$3.warn(error);
5780
+ logger.warn(error);
5781
5781
  return Promise.reject(new Error(error));
5782
5782
  }
5783
5783
  const options = {
@@ -5787,15 +5787,15 @@ class WebRTCClient extends Emitter {
5787
5787
  return session.accept(options).then(() => {
5788
5788
  if (session.isCanceled) {
5789
5789
  const message = 'accepted a canceled session (or was canceled during the accept phase).';
5790
- logger$3.error(message, { id: session.id });
5790
+ logger.error(message, { id: session.id });
5791
5791
  this.onCallEnded(session);
5792
5792
 
5793
5793
  throw new CanceledCallError(message);
5794
5794
  }
5795
- logger$3.info('sdk webrtc answer, accepted.');
5795
+ logger.info('sdk webrtc answer, accepted.');
5796
5796
  this._onAccepted(session);
5797
5797
  }).catch(e => {
5798
- logger$3.error(`answer call error for ${session ? session.id : 'n/a'}`, e);
5798
+ logger.error(`answer call error for ${session ? session.id : 'n/a'}`, e);
5799
5799
 
5800
5800
  throw e;
5801
5801
  });
@@ -5803,7 +5803,7 @@ class WebRTCClient extends Emitter {
5803
5803
 
5804
5804
  hangup(session ) {
5805
5805
  const { state, id } = session;
5806
- logger$3.info('sdk webrtc hangup call', { id, state });
5806
+ logger.info('sdk webrtc hangup call', { id, state });
5807
5807
 
5808
5808
  try {
5809
5809
  this._stopSendingStats(session);
@@ -5832,7 +5832,7 @@ class WebRTCClient extends Emitter {
5832
5832
 
5833
5833
  return bye();
5834
5834
  } catch (error) {
5835
- logger$3.warn('sdk webrtc hangup, error', error);
5835
+ logger.warn('sdk webrtc hangup, error', error);
5836
5836
  }
5837
5837
 
5838
5838
  return null;
@@ -5850,7 +5850,7 @@ class WebRTCClient extends Emitter {
5850
5850
  // Fetch and emit an event at `interval` with session network stats
5851
5851
  startNetworkMonitoring(session , interval = 1000) {
5852
5852
  const sessionId = this.getSipSessionId(session);
5853
- logger$3.info('starting network inspection', { id: sessionId });
5853
+ logger.info('starting network inspection', { id: sessionId });
5854
5854
 
5855
5855
  this.sessionNetworkStats[sessionId] = [];
5856
5856
 
@@ -5860,7 +5860,7 @@ class WebRTCClient extends Emitter {
5860
5860
  stopNetworkMonitoring(session ) {
5861
5861
  const sessionId = this.getSipSessionId(session);
5862
5862
  const exists = sessionId in this.networkMonitoringInterval;
5863
- logger$3.info('stopping network inspection', { id: sessionId, exists });
5863
+ logger.info('stopping network inspection', { id: sessionId, exists });
5864
5864
 
5865
5865
  if (exists) {
5866
5866
  clearInterval(this.networkMonitoringInterval[sessionId]);
@@ -5870,17 +5870,17 @@ class WebRTCClient extends Emitter {
5870
5870
  }
5871
5871
 
5872
5872
  reject(session ) {
5873
- logger$3.info('sdk webrtc reject call', { id: session.id });
5873
+ logger.info('sdk webrtc reject call', { id: session.id });
5874
5874
 
5875
5875
  try {
5876
5876
  return session.reject ? session.reject() : session.cancel();
5877
5877
  } catch (e) {
5878
- logger$3.warn('Error when rejecting call', e.message, e.stack);
5878
+ logger.warn('Error when rejecting call', e.message, e.stack);
5879
5879
  }
5880
5880
  }
5881
5881
 
5882
5882
  async close() {
5883
- logger$3.info('sdk webrtc closing client', { userAgent: !!this.userAgent });
5883
+ logger.info('sdk webrtc closing client', { userAgent: !!this.userAgent });
5884
5884
  this._cleanupMedia();
5885
5885
  this.connectionPromise = null;
5886
5886
 
@@ -5911,7 +5911,7 @@ class WebRTCClient extends Emitter {
5911
5911
  // eg: "INVITE not rejectable in state Completed"
5912
5912
  }
5913
5913
  this.userAgent = null;
5914
- logger$3.info('sdk webrtc client closed');
5914
+ logger.info('sdk webrtc client closed');
5915
5915
  }
5916
5916
 
5917
5917
  getNumber(session ) {
@@ -5924,13 +5924,13 @@ class WebRTCClient extends Emitter {
5924
5924
  }
5925
5925
 
5926
5926
  mute(session ) {
5927
- logger$3.info('sdk webrtc mute', { id: session.id });
5927
+ logger.info('sdk webrtc mute', { id: session.id });
5928
5928
 
5929
5929
  this._toggleAudio(session, true);
5930
5930
  }
5931
5931
 
5932
5932
  unmute(session ) {
5933
- logger$3.info('sdk webrtc unmute', { id: session.id });
5933
+ logger.info('sdk webrtc unmute', { id: session.id });
5934
5934
 
5935
5935
  this._toggleAudio(session, false);
5936
5936
  }
@@ -5970,13 +5970,13 @@ class WebRTCClient extends Emitter {
5970
5970
  }
5971
5971
 
5972
5972
  toggleCameraOn(session ) {
5973
- logger$3.info('sdk webrtc toggle camera on', { id: session.id });
5973
+ logger.info('sdk webrtc toggle camera on', { id: session.id });
5974
5974
 
5975
5975
  this._toggleVideo(session, false);
5976
5976
  }
5977
5977
 
5978
5978
  toggleCameraOff(session ) {
5979
- logger$3.info('sdk webrtc toggle camera off', { id: session.id });
5979
+ logger.info('sdk webrtc toggle camera off', { id: session.id });
5980
5980
 
5981
5981
  this._toggleVideo(session, true);
5982
5982
  }
@@ -5985,7 +5985,7 @@ class WebRTCClient extends Emitter {
5985
5985
  const sessionId = this.getSipSessionId(session);
5986
5986
  const hasVideo = hadVideo || this.hasLocalVideo(sessionId);
5987
5987
 
5988
- logger$3.info('sdk webrtc hold', {
5988
+ logger.info('sdk webrtc hold', {
5989
5989
  sessionId,
5990
5990
  keys: Object.keys(this.heldSessions),
5991
5991
  pendingReinvite: !!session.pendingReinvite,
@@ -6034,7 +6034,7 @@ class WebRTCClient extends Emitter {
6034
6034
  const sessionId = this.getSipSessionId(session);
6035
6035
  const hasVideo = sessionId in this.heldSessions && this.heldSessions[sessionId].hasVideo;
6036
6036
 
6037
- logger$3.info('sdk webrtc unhold', {
6037
+ logger.info('sdk webrtc unhold', {
6038
6038
  sessionId,
6039
6039
  keys: Object.keys(this.heldSessions),
6040
6040
  pendingReinvite: !!session.pendingReinvite,
@@ -6182,7 +6182,7 @@ class WebRTCClient extends Emitter {
6182
6182
  if (!session.sessionDescriptionHandler) {
6183
6183
  return;
6184
6184
  }
6185
- logger$3.info('Sending DTMF', {
6185
+ logger.info('Sending DTMF', {
6186
6186
  id: this.getSipSessionId(session),
6187
6187
  tone,
6188
6188
  });
@@ -6198,7 +6198,7 @@ class WebRTCClient extends Emitter {
6198
6198
  transfer(session , target ) {
6199
6199
  this.hold(session);
6200
6200
 
6201
- logger$3.info('Transfering a session', {
6201
+ logger.info('Transfering a session', {
6202
6202
  id: this.getSipSessionId(session),
6203
6203
  target,
6204
6204
  });
@@ -6220,17 +6220,17 @@ class WebRTCClient extends Emitter {
6220
6220
  atxfer(session ) {
6221
6221
  this.hold(session);
6222
6222
 
6223
- logger$3.info('webrtc transfer started', { id: this.getSipSessionId(session) });
6223
+ logger.info('webrtc transfer started', { id: this.getSipSessionId(session) });
6224
6224
 
6225
6225
  const result = {
6226
6226
  newSession: null,
6227
6227
  init: async (target ) => {
6228
- logger$3.info('webrtc transfer initialized', { id: this.getSipSessionId(session), target });
6228
+ logger.info('webrtc transfer initialized', { id: this.getSipSessionId(session), target });
6229
6229
 
6230
6230
  result.newSession = await this.call(target);
6231
6231
  },
6232
6232
  complete: () => {
6233
- logger$3.info('webrtc transfer completed', {
6233
+ logger.info('webrtc transfer completed', {
6234
6234
  id: this.getSipSessionId(session),
6235
6235
  referId: this.getSipSessionId(result.newSession),
6236
6236
  });
@@ -6251,7 +6251,7 @@ class WebRTCClient extends Emitter {
6251
6251
  return;
6252
6252
  }
6253
6253
 
6254
- logger$3.info('send WebRTC message', { sipId: sipSession.id, contentType });
6254
+ logger.info('send WebRTC message', { sipId: sipSession.id, contentType });
6255
6255
 
6256
6256
  try {
6257
6257
  sipSession.message({
@@ -6293,7 +6293,7 @@ class WebRTCClient extends Emitter {
6293
6293
  }
6294
6294
 
6295
6295
  changeAudioOutputVolume(volume ) {
6296
- logger$3.info('Changing audio output volume', { volume });
6296
+ logger.info('Changing audio output volume', { volume });
6297
6297
 
6298
6298
  Object.values(this.audioElements).forEach(audioElement => {
6299
6299
  if (audioElement instanceof HTMLAudioElement) {
@@ -6305,7 +6305,7 @@ class WebRTCClient extends Emitter {
6305
6305
  }
6306
6306
 
6307
6307
  changeAudioOutputDevice(id ) {
6308
- logger$3.info('Changing audio output device', { id });
6308
+ logger.info('Changing audio output device', { id });
6309
6309
 
6310
6310
  Object.values(this.audioElements).forEach(audioElement => {
6311
6311
  // `setSinkId` method is not included in any flow type definitions for HTMLAudioElements but is a valid method
@@ -6322,7 +6322,7 @@ class WebRTCClient extends Emitter {
6322
6322
 
6323
6323
  changeAudioInputDevice(id , session ) {
6324
6324
  const currentId = this.getAudioDeviceId();
6325
- logger$3.info('setting audio input device', { id, currentId, session: !!session });
6325
+ logger.info('setting audio input device', { id, currentId, session: !!session });
6326
6326
 
6327
6327
  if (id === currentId) {
6328
6328
  return null;
@@ -6368,7 +6368,7 @@ class WebRTCClient extends Emitter {
6368
6368
 
6369
6369
  setVideoInputDevice(id ) {
6370
6370
  const currentId = this.getVideoDeviceId();
6371
- logger$3.info('setting video input device', { id, currentId });
6371
+ logger.info('setting video input device', { id, currentId });
6372
6372
 
6373
6373
  if (id === currentId) {
6374
6374
  return null;
@@ -6393,7 +6393,7 @@ class WebRTCClient extends Emitter {
6393
6393
  const sessionId = this.getSipSessionId(session);
6394
6394
  const localStream = this.getLocalStream(sessionId);
6395
6395
 
6396
- logger$3.info('changing video input device', { id, sessionId });
6396
+ logger.info('changing video input device', { id, sessionId });
6397
6397
 
6398
6398
  // Release old video stream
6399
6399
  if (localStream) {
@@ -6461,7 +6461,7 @@ class WebRTCClient extends Emitter {
6461
6461
  const shouldDoScreenSharing = newConstraints && newConstraints.screen;
6462
6462
  const desktop = newConstraints && newConstraints.desktop;
6463
6463
 
6464
- logger$3.info('Sending reinvite', {
6464
+ logger.info('Sending reinvite', {
6465
6465
  id: this.getSipSessionId(sipSession),
6466
6466
  newConstraints,
6467
6467
  conference,
@@ -6499,7 +6499,7 @@ class WebRTCClient extends Emitter {
6499
6499
  sipSession.incomingInviteRequest.message.body = response.message.body;
6500
6500
  }
6501
6501
 
6502
- logger$3.info('on re-INVITE accepted', {
6502
+ logger.info('on re-INVITE accepted', {
6503
6503
  id: this.getSipSessionId(sipSession),
6504
6504
  wasMuted,
6505
6505
  shouldDoScreenSharing,
@@ -6674,7 +6674,7 @@ class WebRTCClient extends Emitter {
6674
6674
  }
6675
6675
 
6676
6676
  startHeartbeat() {
6677
- logger$3.info('sdk webrtc start heartbeat', { userAgent: !!this.userAgent });
6677
+ logger.info('sdk webrtc start heartbeat', { userAgent: !!this.userAgent });
6678
6678
  if (!this.userAgent) {
6679
6679
  this.heartbeat.stop();
6680
6680
  return;
@@ -6687,7 +6687,7 @@ class WebRTCClient extends Emitter {
6687
6687
  }
6688
6688
 
6689
6689
  stopHeartbeat() {
6690
- logger$3.info('sdk webrtc stop heartbeat');
6690
+ logger.info('sdk webrtc stop heartbeat');
6691
6691
  this.heartbeat.stop();
6692
6692
  }
6693
6693
 
@@ -6708,7 +6708,7 @@ class WebRTCClient extends Emitter {
6708
6708
  }
6709
6709
 
6710
6710
  attemptReconnection() {
6711
- logger$3.info('attempt reconnection', { userAgent: !!this.userAgent });
6711
+ logger.info('attempt reconnection', { userAgent: !!this.userAgent });
6712
6712
  if (!this.userAgent) {
6713
6713
  return;
6714
6714
  }
@@ -6733,7 +6733,7 @@ class WebRTCClient extends Emitter {
6733
6733
  return;
6734
6734
  }
6735
6735
 
6736
- logger$3.info('setting local media stream', {
6736
+ logger.info('setting local media stream', {
6737
6737
  sipSessionId,
6738
6738
  tracks: newStream ? newStream.getTracks() : null,
6739
6739
  });
@@ -6750,7 +6750,7 @@ class WebRTCClient extends Emitter {
6750
6750
 
6751
6751
  const oldStream = this.getLocalStream(sipSessionId);
6752
6752
 
6753
- logger$3.info('updating local stream', {
6753
+ logger.info('updating local stream', {
6754
6754
  sipSessionId,
6755
6755
  oldStream: !!oldStream,
6756
6756
  tracks: newStream.getTracks(),
@@ -6770,7 +6770,7 @@ class WebRTCClient extends Emitter {
6770
6770
  const remoteStream = this.getRemoteStream(sessionId);
6771
6771
  const pc = this.getPeerConnection(sessionId);
6772
6772
 
6773
- logger$3.info('Updating remote stream', {
6773
+ logger.info('Updating remote stream', {
6774
6774
  sessionId,
6775
6775
  tracks: remoteStream ? remoteStream.getTracks() : null,
6776
6776
  receiverTracks: pc && pc.getReceivers ? pc.getReceivers().map(receiver => receiver.track) : null,
@@ -6795,14 +6795,16 @@ class WebRTCClient extends Emitter {
6795
6795
  const screenSharing = constraints && 'screen' in constraints ? constraints.screen : false;
6796
6796
  const isDesktop = constraints && 'desktop' in constraints ? constraints.desktop : false;
6797
6797
  const withAudio = constraints && 'audio' in constraints ? constraints.audio : true;
6798
+ const mandatoryVideo = constraints && typeof constraints.video === 'object' ? constraints.video.mandatory : {};
6798
6799
 
6799
- logger$3.info('Retrieving media a configuration', { enableVideo, screenSharing, isDesktop, withAudio, constraints });
6800
+ logger.info('Retrieving media a configuration', { enableVideo, screenSharing, isDesktop, withAudio, constraints });
6800
6801
 
6801
6802
  return {
6802
6803
  constraints: {
6803
6804
  // Exact constraint are not supported with `getDisplayMedia` and we must have a video=false in desktop screenshare
6804
6805
  audio: screenSharing ? !isDesktop : (withAudio ? this._getAudioConstraints() : false),
6805
- video: screenSharing ? (isDesktop ? ({ mandatory: { chromeMediaSource: 'desktop' } }) : { cursor: 'always' })
6806
+ video: screenSharing ? (isDesktop
6807
+ ? ({ mandatory: { chromeMediaSource: 'desktop', ...(mandatoryVideo || {}) } }) : { cursor: 'always' })
6806
6808
  : this._getVideoConstraints(enableVideo),
6807
6809
  screen: screenSharing,
6808
6810
  desktop: isDesktop,
@@ -6845,7 +6847,7 @@ class WebRTCClient extends Emitter {
6845
6847
  }
6846
6848
 
6847
6849
  _onTransportError() {
6848
- logger$3.error('on transport error');
6850
+ logger.error('on transport error');
6849
6851
  this.eventEmitter.emit(TRANSPORT_ERROR);
6850
6852
  this.attemptReconnection();
6851
6853
  }
@@ -6854,7 +6856,7 @@ class WebRTCClient extends Emitter {
6854
6856
  const body = message && typeof message === 'object' ? message.data : message;
6855
6857
  if (body && body.indexOf('200 OK') !== -1) {
6856
6858
  if (this.hasHeartbeat()) {
6857
- logger$3.info('on heartbeat received from Asterisk', { hasHeartbeat: this.hasHeartbeat() });
6859
+ logger.info('on heartbeat received from Asterisk', { hasHeartbeat: this.hasHeartbeat() });
6858
6860
 
6859
6861
  this.heartbeat.onHeartbeat();
6860
6862
  if (this.heartbeatCb) {
@@ -6865,7 +6867,7 @@ class WebRTCClient extends Emitter {
6865
6867
  }
6866
6868
 
6867
6869
  async _onHeartbeatTimeout() {
6868
- logger$3.info('sdk webrtc heartbeat timed out', { userAgent: !!this.userAgent, cb: !!this.heartbeatTimeoutCb });
6870
+ logger.info('sdk webrtc heartbeat timed out', { userAgent: !!this.userAgent, cb: !!this.heartbeatTimeoutCb });
6869
6871
 
6870
6872
  if (this.heartbeatTimeoutCb) {
6871
6873
  this.heartbeatTimeoutCb();
@@ -6877,7 +6879,7 @@ class WebRTCClient extends Emitter {
6877
6879
  try {
6878
6880
  await this.userAgent.transport.disconnect();
6879
6881
  } catch (e) {
6880
- logger$3.error('Transport disconnection after heartbeat timeout, error', e);
6882
+ logger.error('Transport disconnection after heartbeat timeout, error', e);
6881
6883
  }
6882
6884
  }
6883
6885
 
@@ -6910,31 +6912,31 @@ class WebRTCClient extends Emitter {
6910
6912
  }
6911
6913
 
6912
6914
  _connectIfNeeded() {
6913
- logger$3.info('connect if needed, checking', { connected: this.isConnected() });
6915
+ logger.info('connect if needed, checking', { connected: this.isConnected() });
6914
6916
  if (!this.userAgent) {
6915
- logger$3.info('need to recreate User Agent');
6917
+ logger.info('need to recreate User Agent');
6916
6918
  this.userAgent = this.createUserAgent(this.uaConfigOverrides);
6917
6919
  }
6918
6920
 
6919
6921
  if (this.isConnected()) {
6920
- logger$3.info('webrtc sdk, already connected');
6922
+ logger.info('webrtc sdk, already connected');
6921
6923
  return Promise.resolve();
6922
6924
  }
6923
6925
 
6924
6926
  if (this.isConnecting()) {
6925
- logger$3.info('webrtc sdk, already connecting...');
6927
+ logger.info('webrtc sdk, already connecting...');
6926
6928
 
6927
6929
  this.connectionPromise = this.userAgent.transport.connectPromise;
6928
6930
  return this.connectionPromise;
6929
6931
  }
6930
6932
 
6931
6933
  if (this.connectionPromise) {
6932
- logger$3.info('webrtc sdk, connection promise connecting...');
6934
+ logger.info('webrtc sdk, connection promise connecting...');
6933
6935
  // $FlowFixMe
6934
6936
  return this.connectionPromise;
6935
6937
  }
6936
6938
 
6937
- logger$3.info('WebRTC UA needs to connect');
6939
+ logger.info('WebRTC UA needs to connect');
6938
6940
 
6939
6941
  // Force UA to reconnect
6940
6942
  if (this.userAgent && this.userAgent.state !== userAgentState.UserAgentState.Stopped) {
@@ -7059,7 +7061,7 @@ class WebRTCClient extends Emitter {
7059
7061
 
7060
7062
  sdh.peerConnectionDelegate = {
7061
7063
  onicecandidateerror: (error ) => {
7062
- logger$3.error('on icecandidate error', {
7064
+ logger.error('on icecandidate error', {
7063
7065
  address: error.address,
7064
7066
  port: error.port,
7065
7067
  errorCode: error.errorCode,
@@ -7088,7 +7090,7 @@ class WebRTCClient extends Emitter {
7088
7090
  updatedNumber = session.assertedIdentity.uri.normal.user;
7089
7091
  updatedCalleeName = session.assertedIdentity.displayName || updatedNumber;
7090
7092
  }
7091
- logger$3.info('re-invite received', { updatedCalleeName, updatedNumber, hadRemoteVideo });
7093
+ logger.info('re-invite received', { updatedCalleeName, updatedNumber, hadRemoteVideo });
7092
7094
 
7093
7095
  // Useful to know if it's a video upgrade or an unhold from a remote peer with a video stream
7094
7096
 
@@ -7109,7 +7111,7 @@ class WebRTCClient extends Emitter {
7109
7111
  }
7110
7112
 
7111
7113
  _onAccepted(session , sessionDialog , withEvent = true) {
7112
- logger$3.info('on call accepted', { id: session.id, remoteTag: session.remoteTag });
7114
+ logger.info('on call accepted', { id: session.id, remoteTag: session.remoteTag });
7113
7115
 
7114
7116
  this.storeSipSession(session);
7115
7117
 
@@ -7121,7 +7123,7 @@ class WebRTCClient extends Emitter {
7121
7123
  const onTrack = (event ) => {
7122
7124
  const isAudioOnly = this._isAudioOnly(session);
7123
7125
  const { kind, label, readyState, id, muted } = event.track;
7124
- logger$3.info('on track event', { isAudioOnly, kind, label, readyState, id, muted });
7126
+ logger.info('on track event', { isAudioOnly, kind, label, readyState, id, muted });
7125
7127
 
7126
7128
  // Stop video track in audio only mode
7127
7129
  if (isAudioOnly && kind === 'video') {
@@ -7137,12 +7139,14 @@ class WebRTCClient extends Emitter {
7137
7139
 
7138
7140
  session.sessionDescriptionHandler.remoteMediaStream.onaddtrack = onTrack;
7139
7141
 
7140
- pc.oniceconnectionstatechange = () => {
7141
- logger$3.info('on ice connection state changed', { state: pc.iceConnectionState });
7142
- if (pc.iceConnectionState === 'disconnected') {
7143
- this.eventEmitter.emit(ON_DISCONNECTED);
7144
- }
7145
- };
7142
+ if (pc) {
7143
+ pc.oniceconnectionstatechange = () => {
7144
+ logger.info('on ice connection state changed', { state: pc.iceConnectionState });
7145
+ if (pc.iceConnectionState === 'disconnected') {
7146
+ this.eventEmitter.emit(ON_DISCONNECTED);
7147
+ }
7148
+ };
7149
+ }
7146
7150
 
7147
7151
  if (withEvent) {
7148
7152
  this.eventEmitter.emit(ACCEPTED, session, sessionDialog);
@@ -7311,10 +7315,10 @@ class WebRTCClient extends Emitter {
7311
7315
 
7312
7316
  _stopSendingStats(session ) {
7313
7317
  const sessionId = this.getSipSessionId(session);
7314
- logger$3.trace('Check for stopping stats', { sessionId, ids: Object.keys(this.statsIntervals) });
7318
+ logger.trace('Check for stopping stats', { sessionId, ids: Object.keys(this.statsIntervals) });
7315
7319
 
7316
7320
  if (sessionId in this.statsIntervals) {
7317
- logger$3.trace('Stop sending stats for call', { sessionId });
7321
+ logger.trace('Stop sending stats for call', { sessionId });
7318
7322
  this.statsIntervals[sessionId]();
7319
7323
  delete this.statsIntervals[sessionId];
7320
7324
  }
@@ -7330,7 +7334,7 @@ class WebRTCClient extends Emitter {
7330
7334
  try {
7331
7335
  await this.userAgent.transport.disconnect();
7332
7336
  } catch (e) {
7333
- logger$3.error('WebRTC transport disconnect, error', e);
7337
+ logger.error('WebRTC transport disconnect, error', e);
7334
7338
  }
7335
7339
  }
7336
7340
  }
@@ -7352,13 +7356,17 @@ class WebRTCClient extends Emitter {
7352
7356
  const nbStats = this.sessionNetworkStats[sessionId].length;
7353
7357
  const lastNetworkStats = this.sessionNetworkStats[sessionId][nbStats - 1];
7354
7358
  const lastAudioSent = lastNetworkStats ? lastNetworkStats.audioBytesSent : 0;
7359
+ const lastAudioContentSent = lastNetworkStats ? lastNetworkStats.audioContentSent : 0;
7355
7360
  const lastVideoSent = lastNetworkStats ? lastNetworkStats.videoBytesSent : 0;
7356
7361
  const lastAudioReceived = lastNetworkStats ? lastNetworkStats.audioBytesReceived : 0;
7362
+ const lastAudioContentReceived = lastNetworkStats ? lastNetworkStats.audioContentReceived : 0;
7357
7363
  const lastVideoReceived = lastNetworkStats ? lastNetworkStats.videoBytesReceived : 0;
7358
7364
  const lastTransportSent = lastNetworkStats ? lastNetworkStats.transportSent : 0;
7359
7365
  const lastTransportReceived = lastNetworkStats ? lastNetworkStats.transportReceived : 0;
7360
- let audioBytesSent = 0;
7361
- let audioBytesReceived = 0;
7366
+ let audioBytesSent = 0; // content + header
7367
+ let audioBytesReceived = 0; // content + header
7368
+ let audioContentSent = 0; // useful to detect blank call
7369
+ let audioContentReceived = 0;
7362
7370
  let videoBytesSent = 0;
7363
7371
  let videoBytesReceived = 0;
7364
7372
  let transportSent = 0;
@@ -7368,6 +7376,7 @@ class WebRTCClient extends Emitter {
7368
7376
  stats.forEach(report => {
7369
7377
  if (report.type === 'outbound-rtp' && report.kind === 'audio') {
7370
7378
  audioBytesSent += Number(report.bytesSent) + Number(report.headerBytesSent);
7379
+ audioContentSent += Number(report.bytesSent);
7371
7380
  }
7372
7381
  if (report.type === 'remote-outbound-rtp' && report.kind === 'audio') {
7373
7382
  audioBytesSent += Number(report.bytesSent);
@@ -7379,6 +7388,7 @@ class WebRTCClient extends Emitter {
7379
7388
  packetsLost += Number(report.packetsLost);
7380
7389
  networkStats.packetsReceived = Number(report.packetsReceived);
7381
7390
  audioBytesReceived += Number(report.bytesReceived) + Number(report.headerBytesReceived);
7391
+ audioContentReceived += Number(report.bytesReceived);
7382
7392
  }
7383
7393
  if (report.type === 'inbound-rtp' && report.kind === 'video') {
7384
7394
  videoBytesReceived += Number(report.bytesReceived) + Number(report.headerBytesReceived);
@@ -7407,10 +7417,17 @@ class WebRTCClient extends Emitter {
7407
7417
  });
7408
7418
 
7409
7419
  networkStats.packetsLost = packetsLost;
7420
+
7410
7421
  networkStats.totalAudioBytesSent = audioBytesSent;
7411
7422
  networkStats.audioBytesSent = audioBytesSent - lastAudioSent;
7412
7423
  networkStats.totalAudioBytesReceived = audioBytesReceived - lastAudioReceived;
7413
7424
  networkStats.audioBytesReceived = audioBytesReceived;
7425
+
7426
+ networkStats.totalAudioContentSent = audioContentSent;
7427
+ networkStats.audioContentSent = audioContentSent - lastAudioContentSent;
7428
+ networkStats.totalAudioBytesReceived = audioContentReceived - lastAudioContentReceived;
7429
+ networkStats.audioContentReceived = audioContentReceived;
7430
+
7414
7431
  networkStats.totalVideoBytesSent = videoBytesSent;
7415
7432
  networkStats.videoBytesSent = videoBytesSent - lastVideoSent;
7416
7433
  networkStats.totalVideoBytesReceived = videoBytesReceived;