@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
@@ -109,7 +109,7 @@ const isMobile = () => typeof navigator !== 'undefined' && navigator.product ===
109
109
 
110
110
  const methods = ['head', 'get', 'post', 'put', 'delete'];
111
111
 
112
- const logger = IssueReporter$1 ? IssueReporter$1.loggerFor('api') : console;
112
+ const logger$2 = IssueReporter$1 ? IssueReporter$1.loggerFor('api') : console;
113
113
 
114
114
  // Use a function here to be able to mock it in tests
115
115
  const realFetch = () => {
@@ -248,7 +248,7 @@ class ApiRequester {
248
248
  };
249
249
 
250
250
  if (this.refreshTokenPromise) {
251
- logger.info('A token is already refreshing, waiting ...', { url });
251
+ logger$2.info('A token is already refreshing, waiting ...', { url });
252
252
  await this.refreshTokenPromise;
253
253
  }
254
254
 
@@ -268,7 +268,7 @@ class ApiRequester {
268
268
  return promise.then(async (err ) => {
269
269
  // Check if the token is still valid
270
270
  if (firstCall && this._checkTokenExpired(response, err)) {
271
- logger.warn('token expired', { error: err.reason });
271
+ logger$2.warn('token expired', { error: err.reason });
272
272
  // Replay the call after refreshing the token
273
273
  return this._replayWithNewToken(err, path, method, body, headers, parse);
274
274
  }
@@ -278,7 +278,7 @@ class ApiRequester {
278
278
  : exceptionClass.fromResponse(err, response.status);
279
279
 
280
280
  if (this.shouldLogErrors) {
281
- logger.error('API error', error);
281
+ logger$2.error('API error', error);
282
282
  }
283
283
 
284
284
  throw error;
@@ -288,7 +288,7 @@ class ApiRequester {
288
288
  return newParse(response, isJson);
289
289
  }).catch(error => {
290
290
  if (this.shouldLogErrors) {
291
- logger.error('Fetch failed', { url, options, message: error.message, stack: error.stack });
291
+ logger$2.error('Fetch failed', { url, options, message: error.message, stack: error.stack });
292
292
  }
293
293
 
294
294
  throw error;
@@ -316,13 +316,13 @@ class ApiRequester {
316
316
  ) {
317
317
  const isTokenNotFound = this._isTokenNotFound(err);
318
318
  let newPath = path;
319
- logger.info('refreshing token', { inProgress: !!this.refreshTokenPromise });
319
+ logger$2.info('refreshing token', { inProgress: !!this.refreshTokenPromise });
320
320
 
321
321
  this.refreshTokenPromise = this.refreshTokenPromise || this.refreshTokenCallback();
322
322
 
323
323
  return this.refreshTokenPromise.then(() => {
324
324
  this.refreshTokenPromise = null;
325
- logger.info('token refreshed', { isTokenNotFound });
325
+ logger$2.info('token refreshed', { isTokenNotFound });
326
326
  if (isTokenNotFound) {
327
327
  const pathParts = path.split('/');
328
328
  pathParts.pop();
@@ -4147,7 +4147,7 @@ const TRANSFER_FLOW_BLIND = 'blind';
4147
4147
 
4148
4148
  // const MINIMUM_WAZO_ENGINE_VERSION_FOR_CTI_HOLD = '20.11';
4149
4149
 
4150
- const logger$1 = IssueReporter$1 ? IssueReporter$1.loggerFor('cti-phone') : console;
4150
+ IssueReporter$1 ? IssueReporter$1.loggerFor('cti-phone') : console;
4151
4151
 
4152
4152
  /* */
4153
4153
 
@@ -5066,7 +5066,7 @@ const AGENTD_VERSION = '1.0';
5066
5066
  const WEBHOOKD_VERSION = '1.0';
5067
5067
  const AMID_VERSION = '1.0';
5068
5068
 
5069
- const logger$2 = IssueReporter$1 ? IssueReporter$1.loggerFor('api') : console;
5069
+ const logger$1 = IssueReporter$1 ? IssueReporter$1.loggerFor('api') : console;
5070
5070
 
5071
5071
  class ApiClient {
5072
5072
 
@@ -5118,12 +5118,12 @@ class ApiClient {
5118
5118
  }
5119
5119
 
5120
5120
  async forceRefreshToken() {
5121
- logger$2.info('forcing refresh token, calling callback');
5121
+ logger$1.info('forcing refresh token, calling callback');
5122
5122
  return this.refreshTokenCallback();
5123
5123
  }
5124
5124
 
5125
5125
  async refreshTokenCallback() {
5126
- logger$2.info('refresh token callback called', {
5126
+ logger$1.info('refresh token callback called', {
5127
5127
  refreshToken: this.refreshToken,
5128
5128
  refreshBackend: this.refreshBackend,
5129
5129
  refreshExpiration: this.refreshExpiration,
@@ -5141,7 +5141,7 @@ class ApiClient {
5141
5141
  this.isMobile,
5142
5142
  );
5143
5143
 
5144
- logger$2.info('token refreshed', { token: session.token });
5144
+ logger$1.info('token refreshed', { token: session.token });
5145
5145
 
5146
5146
  if (this.onRefreshToken) {
5147
5147
  this.onRefreshToken(session.token, session);
@@ -5314,7 +5314,7 @@ const DEFAULT_ICE_TIMEOUT = 3000;
5314
5314
  const SEND_STATS_DELAY = 5000;
5315
5315
 
5316
5316
  const states = ['STATUS_NULL', 'STATUS_NEW', 'STATUS_CONNECTING', 'STATUS_CONNECTED', 'STATUS_COMPLETED'];
5317
- const logger$3 = IssueReporter$1 ? IssueReporter$1.loggerFor('webrtc-client') : console;
5317
+ const logger = IssueReporter$1 ? IssueReporter$1.loggerFor('webrtc-client') : console;
5318
5318
  const statsLogger = IssueReporter$1 ? IssueReporter$1.loggerFor('webrtc-stats') : console;
5319
5319
 
5320
5320
  // events
@@ -5490,13 +5490,13 @@ class WebRTCClient extends Emitter {
5490
5490
 
5491
5491
  createUserAgent(configOverrides ) {
5492
5492
  const webRTCConfiguration = this._createWebRTCConfiguration(configOverrides);
5493
- logger$3.info('sdk webrtc, creating UA', { webRTCConfiguration });
5493
+ logger.info('sdk webrtc, creating UA', { webRTCConfiguration });
5494
5494
 
5495
5495
  webRTCConfiguration.delegate = {
5496
5496
  onConnect: this.onConnect.bind(this),
5497
5497
  onDisconnect: this.onDisconnect.bind(this),
5498
5498
  onInvite: (invitation ) => {
5499
- logger$3.info('sdk webrtc on invite', {
5499
+ logger.info('sdk webrtc on invite', {
5500
5500
  method: 'delegate.onInvite',
5501
5501
  id: invitation.id,
5502
5502
  remoteURI: invitation.remoteURI,
@@ -5539,7 +5539,7 @@ class WebRTCClient extends Emitter {
5539
5539
  }
5540
5540
 
5541
5541
  onConnect() {
5542
- logger$3.info('sdk webrtc connected', { method: 'delegate.onConnect' });
5542
+ logger.info('sdk webrtc connected', { method: 'delegate.onConnect' });
5543
5543
  this.eventEmitter.emit(CONNECTED);
5544
5544
  if (!this.isRegistered() && this.registerer && this.registerer.waiting) {
5545
5545
  this.registerer.waitingToggle(false);
@@ -5548,7 +5548,7 @@ class WebRTCClient extends Emitter {
5548
5548
  }
5549
5549
 
5550
5550
  async onDisconnect(error ) {
5551
- logger$3.info('sdk webrtc disconnected', { method: 'delegate.onConnect', error });
5551
+ logger.info('sdk webrtc disconnected', { method: 'delegate.onConnect', error });
5552
5552
  this.connectionPromise = null;
5553
5553
  // The UA will attempt to reconnect automatically when an error occurred
5554
5554
  this.eventEmitter.emit(DISCONNECTED, error);
@@ -5573,37 +5573,37 @@ class WebRTCClient extends Emitter {
5573
5573
  };
5574
5574
 
5575
5575
  if (this.skipRegister) {
5576
- logger$3.info('sdk webrtc skip register...', logInfo);
5576
+ logger.info('sdk webrtc skip register...', logInfo);
5577
5577
  return Promise.resolve();
5578
5578
  }
5579
5579
 
5580
- logger$3.info('sdk webrtc registering...', logInfo);
5580
+ logger.info('sdk webrtc registering...', logInfo);
5581
5581
 
5582
5582
  if (!this.userAgent) {
5583
- logger$3.info('sdk webrtc recreating User Agent');
5583
+ logger.info('sdk webrtc recreating User Agent');
5584
5584
  this.userAgent = this.createUserAgent(this.uaConfigOverrides);
5585
5585
  }
5586
5586
  if (!this.userAgent || this.isRegistered()) {
5587
- logger$3.info('sdk webrtc registering aborted, already registered or no UA can be created');
5587
+ logger.info('sdk webrtc registering aborted, already registered or no UA can be created');
5588
5588
  return Promise.resolve();
5589
5589
  }
5590
5590
 
5591
5591
  if (this.connectionPromise || (this.registerer && this.registerer.waiting)) {
5592
- logger$3.info('sdk webrtc registering aborted due to a registration in progress.');
5592
+ logger.info('sdk webrtc registering aborted due to a registration in progress.');
5593
5593
  return Promise.resolve();
5594
5594
  }
5595
5595
 
5596
5596
  const registerOptions = this._isWeb() ? {} : { extraContactHeaderParams: ['mobility=mobile'] };
5597
5597
 
5598
5598
  const onRegisterFailed = () => {
5599
- logger$3.info('sdk webrtc registering failed', { tries, registerer: !!this.registerer });
5599
+ logger.info('sdk webrtc registering failed', { tries, registerer: !!this.registerer });
5600
5600
  this.connectionPromise = null;
5601
5601
  if (this.registerer && this.registerer.waiting) {
5602
5602
  this.registerer.waitingToggle(false);
5603
5603
  }
5604
5604
 
5605
5605
  if (tries <= MAX_REGISTER_TRIES) {
5606
- logger$3.info('sdk webrtc registering, retrying...', { tries });
5606
+ logger.info('sdk webrtc registering, retrying...', { tries });
5607
5607
  setTimeout(() => this.register(tries + 1), 300);
5608
5608
  }
5609
5609
  };
@@ -5612,18 +5612,18 @@ class WebRTCClient extends Emitter {
5612
5612
  // Avoid race condition with the close method called just before register and setting userAgent to null
5613
5613
  // during the resolution of the primise.
5614
5614
  if (!this.userAgent) {
5615
- logger$3.info('sdk webrtc recreating User Agent after connection');
5615
+ logger.info('sdk webrtc recreating User Agent after connection');
5616
5616
  this.userAgent = this.createUserAgent(this.uaConfigOverrides);
5617
5617
  }
5618
5618
 
5619
- logger$3.info('sdk webrtc registering, transport connected', { registerOptions, ua: !!this.userAgent });
5619
+ logger.info('sdk webrtc registering, transport connected', { registerOptions, ua: !!this.userAgent });
5620
5620
  this.registerer = new registerer.Registerer(this.userAgent, registerOptions);
5621
5621
  this.connectionPromise = null;
5622
5622
  this._monkeyPatchRegisterer(this.registerer);
5623
5623
 
5624
5624
  // Bind registerer events
5625
5625
  this.registerer.stateChange.addListener(newState => {
5626
- logger$3.info('sdk webrtc registering, state changed', { newState });
5626
+ logger.info('sdk webrtc registering, state changed', { newState });
5627
5627
 
5628
5628
  if (newState === registererState.RegistererState.Registered && this.registerer
5629
5629
  && this.registerer.state === registererState.RegistererState.Registered) {
@@ -5636,7 +5636,7 @@ class WebRTCClient extends Emitter {
5636
5636
  const options = {
5637
5637
  requestDelegate: {
5638
5638
  onReject: response => {
5639
- logger$3.error('sdk webrtc registering, rejected', { response });
5639
+ logger.error('sdk webrtc registering, rejected', { response });
5640
5640
 
5641
5641
  onRegisterFailed();
5642
5642
  },
@@ -5644,13 +5644,13 @@ class WebRTCClient extends Emitter {
5644
5644
  };
5645
5645
 
5646
5646
  return this.registerer.register(options).catch((e) => {
5647
- logger$3.error('sdk webrtc registering, error', e);
5647
+ logger.error('sdk webrtc registering, error', e);
5648
5648
 
5649
5649
  this.eventEmitter.emit(REGISTRATION_FAILED);
5650
5650
  return e;
5651
5651
  });
5652
5652
  }).catch(error => {
5653
- logger$3.error('sdk webrtc registering, transport error', error);
5653
+ logger.error('sdk webrtc registering, transport error', error);
5654
5654
  onRegisterFailed();
5655
5655
  });
5656
5656
  }
@@ -5679,21 +5679,21 @@ class WebRTCClient extends Emitter {
5679
5679
  }
5680
5680
 
5681
5681
  unregister() {
5682
- logger$3.info('sdk webrtc unregistering..', { userAgent: !!this.userAgent, registerer: !!this.registerer });
5682
+ logger.info('sdk webrtc unregistering..', { userAgent: !!this.userAgent, registerer: !!this.registerer });
5683
5683
  if (!this.registerer) {
5684
5684
  return Promise.resolve();
5685
5685
  }
5686
5686
 
5687
5687
  try {
5688
5688
  return this.registerer.unregister().then(() => {
5689
- logger$3.info('sdk webrtc unregistered');
5689
+ logger.info('sdk webrtc unregistered');
5690
5690
  this._cleanupRegister();
5691
5691
  }).catch(e => {
5692
- logger$3.error('sdk webrtc unregistering, promise error', e);
5692
+ logger.error('sdk webrtc unregistering, promise error', e);
5693
5693
  this._cleanupRegister();
5694
5694
  });
5695
5695
  } catch (e) {
5696
- logger$3.error('sdk webrtc unregistering, error', e);
5696
+ logger.error('sdk webrtc unregistering, error', e);
5697
5697
  // Avoid issue with `undefined is not an object (evaluating 'new.target.prototype')` when triggering a new
5698
5698
  // error when the registerer is in a bad state
5699
5699
  this._cleanupRegister();
@@ -5701,7 +5701,7 @@ class WebRTCClient extends Emitter {
5701
5701
  }
5702
5702
 
5703
5703
  stop() {
5704
- logger$3.info('sdk webrtc stop', { userAgent: !!this.userAgent });
5704
+ logger.info('sdk webrtc stop', { userAgent: !!this.userAgent });
5705
5705
  if (!this.userAgent) {
5706
5706
  return Promise.resolve();
5707
5707
  }
@@ -5709,12 +5709,12 @@ class WebRTCClient extends Emitter {
5709
5709
  return this.userAgent.stop().then(() => {
5710
5710
  return this._cleanupRegister();
5711
5711
  }).catch(e => {
5712
- logger$3.warn('sdk webrtc stop, error', { message: e.message, stack: e.stack });
5712
+ logger.warn('sdk webrtc stop, error', { message: e.message, stack: e.stack });
5713
5713
  });
5714
5714
  }
5715
5715
 
5716
5716
  call(number , enableVideo , audioOnly = false, conference = false) {
5717
- logger$3.info('sdk webrtc creating call', { number, enableVideo, audioOnly });
5717
+ logger.info('sdk webrtc creating call', { number, enableVideo, audioOnly, conference });
5718
5718
  const inviterOptions = {
5719
5719
  sessionDescriptionHandlerOptionsReInvite: {
5720
5720
  conference,
@@ -5745,7 +5745,7 @@ class WebRTCClient extends Emitter {
5745
5745
  this._onAccepted(session, response.session, true);
5746
5746
  },
5747
5747
  onReject: (response ) => {
5748
- logger$3.info('on call rejected', { id: session.id, fromTag: session.fromTag });
5748
+ logger.info('on call rejected', { id: session.id, fromTag: session.fromTag });
5749
5749
  this._stopSendingStats(session);
5750
5750
  this.stopNetworkMonitoring(session);
5751
5751
 
@@ -5768,11 +5768,11 @@ class WebRTCClient extends Emitter {
5768
5768
  }
5769
5769
 
5770
5770
  answer(session , enableVideo ) {
5771
- logger$3.info('sdk webrtc answer call', { id: session.id, enableVideo });
5771
+ logger.info('sdk webrtc answer call', { id: session.id, enableVideo });
5772
5772
 
5773
5773
  if (!session || !session.accept) {
5774
5774
  const error = 'No session to answer, or not an invitation';
5775
- logger$3.warn(error);
5775
+ logger.warn(error);
5776
5776
  return Promise.reject(new Error(error));
5777
5777
  }
5778
5778
  const options = {
@@ -5782,15 +5782,15 @@ class WebRTCClient extends Emitter {
5782
5782
  return session.accept(options).then(() => {
5783
5783
  if (session.isCanceled) {
5784
5784
  const message = 'accepted a canceled session (or was canceled during the accept phase).';
5785
- logger$3.error(message, { id: session.id });
5785
+ logger.error(message, { id: session.id });
5786
5786
  this.onCallEnded(session);
5787
5787
 
5788
5788
  throw new CanceledCallError(message);
5789
5789
  }
5790
- logger$3.info('sdk webrtc answer, accepted.');
5790
+ logger.info('sdk webrtc answer, accepted.');
5791
5791
  this._onAccepted(session);
5792
5792
  }).catch(e => {
5793
- logger$3.error(`answer call error for ${session ? session.id : 'n/a'}`, e);
5793
+ logger.error(`answer call error for ${session ? session.id : 'n/a'}`, e);
5794
5794
 
5795
5795
  throw e;
5796
5796
  });
@@ -5798,7 +5798,7 @@ class WebRTCClient extends Emitter {
5798
5798
 
5799
5799
  hangup(session ) {
5800
5800
  const { state, id } = session;
5801
- logger$3.info('sdk webrtc hangup call', { id, state });
5801
+ logger.info('sdk webrtc hangup call', { id, state });
5802
5802
 
5803
5803
  try {
5804
5804
  this._stopSendingStats(session);
@@ -5827,7 +5827,7 @@ class WebRTCClient extends Emitter {
5827
5827
 
5828
5828
  return bye();
5829
5829
  } catch (error) {
5830
- logger$3.warn('sdk webrtc hangup, error', error);
5830
+ logger.warn('sdk webrtc hangup, error', error);
5831
5831
  }
5832
5832
 
5833
5833
  return null;
@@ -5845,7 +5845,7 @@ class WebRTCClient extends Emitter {
5845
5845
  // Fetch and emit an event at `interval` with session network stats
5846
5846
  startNetworkMonitoring(session , interval = 1000) {
5847
5847
  const sessionId = this.getSipSessionId(session);
5848
- logger$3.info('starting network inspection', { id: sessionId });
5848
+ logger.info('starting network inspection', { id: sessionId });
5849
5849
 
5850
5850
  this.sessionNetworkStats[sessionId] = [];
5851
5851
 
@@ -5855,7 +5855,7 @@ class WebRTCClient extends Emitter {
5855
5855
  stopNetworkMonitoring(session ) {
5856
5856
  const sessionId = this.getSipSessionId(session);
5857
5857
  const exists = sessionId in this.networkMonitoringInterval;
5858
- logger$3.info('stopping network inspection', { id: sessionId, exists });
5858
+ logger.info('stopping network inspection', { id: sessionId, exists });
5859
5859
 
5860
5860
  if (exists) {
5861
5861
  clearInterval(this.networkMonitoringInterval[sessionId]);
@@ -5865,17 +5865,17 @@ class WebRTCClient extends Emitter {
5865
5865
  }
5866
5866
 
5867
5867
  reject(session ) {
5868
- logger$3.info('sdk webrtc reject call', { id: session.id });
5868
+ logger.info('sdk webrtc reject call', { id: session.id });
5869
5869
 
5870
5870
  try {
5871
5871
  return session.reject ? session.reject() : session.cancel();
5872
5872
  } catch (e) {
5873
- logger$3.warn('Error when rejecting call', e.message, e.stack);
5873
+ logger.warn('Error when rejecting call', e.message, e.stack);
5874
5874
  }
5875
5875
  }
5876
5876
 
5877
5877
  async close() {
5878
- logger$3.info('sdk webrtc closing client', { userAgent: !!this.userAgent });
5878
+ logger.info('sdk webrtc closing client', { userAgent: !!this.userAgent });
5879
5879
  this._cleanupMedia();
5880
5880
  this.connectionPromise = null;
5881
5881
 
@@ -5906,7 +5906,7 @@ class WebRTCClient extends Emitter {
5906
5906
  // eg: "INVITE not rejectable in state Completed"
5907
5907
  }
5908
5908
  this.userAgent = null;
5909
- logger$3.info('sdk webrtc client closed');
5909
+ logger.info('sdk webrtc client closed');
5910
5910
  }
5911
5911
 
5912
5912
  getNumber(session ) {
@@ -5919,13 +5919,13 @@ class WebRTCClient extends Emitter {
5919
5919
  }
5920
5920
 
5921
5921
  mute(session ) {
5922
- logger$3.info('sdk webrtc mute', { id: session.id });
5922
+ logger.info('sdk webrtc mute', { id: session.id });
5923
5923
 
5924
5924
  this._toggleAudio(session, true);
5925
5925
  }
5926
5926
 
5927
5927
  unmute(session ) {
5928
- logger$3.info('sdk webrtc unmute', { id: session.id });
5928
+ logger.info('sdk webrtc unmute', { id: session.id });
5929
5929
 
5930
5930
  this._toggleAudio(session, false);
5931
5931
  }
@@ -5965,13 +5965,13 @@ class WebRTCClient extends Emitter {
5965
5965
  }
5966
5966
 
5967
5967
  toggleCameraOn(session ) {
5968
- logger$3.info('sdk webrtc toggle camera on', { id: session.id });
5968
+ logger.info('sdk webrtc toggle camera on', { id: session.id });
5969
5969
 
5970
5970
  this._toggleVideo(session, false);
5971
5971
  }
5972
5972
 
5973
5973
  toggleCameraOff(session ) {
5974
- logger$3.info('sdk webrtc toggle camera off', { id: session.id });
5974
+ logger.info('sdk webrtc toggle camera off', { id: session.id });
5975
5975
 
5976
5976
  this._toggleVideo(session, true);
5977
5977
  }
@@ -5980,7 +5980,7 @@ class WebRTCClient extends Emitter {
5980
5980
  const sessionId = this.getSipSessionId(session);
5981
5981
  const hasVideo = hadVideo || this.hasLocalVideo(sessionId);
5982
5982
 
5983
- logger$3.info('sdk webrtc hold', {
5983
+ logger.info('sdk webrtc hold', {
5984
5984
  sessionId,
5985
5985
  keys: Object.keys(this.heldSessions),
5986
5986
  pendingReinvite: !!session.pendingReinvite,
@@ -6029,7 +6029,7 @@ class WebRTCClient extends Emitter {
6029
6029
  const sessionId = this.getSipSessionId(session);
6030
6030
  const hasVideo = sessionId in this.heldSessions && this.heldSessions[sessionId].hasVideo;
6031
6031
 
6032
- logger$3.info('sdk webrtc unhold', {
6032
+ logger.info('sdk webrtc unhold', {
6033
6033
  sessionId,
6034
6034
  keys: Object.keys(this.heldSessions),
6035
6035
  pendingReinvite: !!session.pendingReinvite,
@@ -6177,7 +6177,7 @@ class WebRTCClient extends Emitter {
6177
6177
  if (!session.sessionDescriptionHandler) {
6178
6178
  return;
6179
6179
  }
6180
- logger$3.info('Sending DTMF', {
6180
+ logger.info('Sending DTMF', {
6181
6181
  id: this.getSipSessionId(session),
6182
6182
  tone,
6183
6183
  });
@@ -6193,7 +6193,7 @@ class WebRTCClient extends Emitter {
6193
6193
  transfer(session , target ) {
6194
6194
  this.hold(session);
6195
6195
 
6196
- logger$3.info('Transfering a session', {
6196
+ logger.info('Transfering a session', {
6197
6197
  id: this.getSipSessionId(session),
6198
6198
  target,
6199
6199
  });
@@ -6215,17 +6215,17 @@ class WebRTCClient extends Emitter {
6215
6215
  atxfer(session ) {
6216
6216
  this.hold(session);
6217
6217
 
6218
- logger$3.info('webrtc transfer started', { id: this.getSipSessionId(session) });
6218
+ logger.info('webrtc transfer started', { id: this.getSipSessionId(session) });
6219
6219
 
6220
6220
  const result = {
6221
6221
  newSession: null,
6222
6222
  init: async (target ) => {
6223
- logger$3.info('webrtc transfer initialized', { id: this.getSipSessionId(session), target });
6223
+ logger.info('webrtc transfer initialized', { id: this.getSipSessionId(session), target });
6224
6224
 
6225
6225
  result.newSession = await this.call(target);
6226
6226
  },
6227
6227
  complete: () => {
6228
- logger$3.info('webrtc transfer completed', {
6228
+ logger.info('webrtc transfer completed', {
6229
6229
  id: this.getSipSessionId(session),
6230
6230
  referId: this.getSipSessionId(result.newSession),
6231
6231
  });
@@ -6246,7 +6246,7 @@ class WebRTCClient extends Emitter {
6246
6246
  return;
6247
6247
  }
6248
6248
 
6249
- logger$3.info('send WebRTC message', { sipId: sipSession.id, contentType });
6249
+ logger.info('send WebRTC message', { sipId: sipSession.id, contentType });
6250
6250
 
6251
6251
  try {
6252
6252
  sipSession.message({
@@ -6288,7 +6288,7 @@ class WebRTCClient extends Emitter {
6288
6288
  }
6289
6289
 
6290
6290
  changeAudioOutputVolume(volume ) {
6291
- logger$3.info('Changing audio output volume', { volume });
6291
+ logger.info('Changing audio output volume', { volume });
6292
6292
 
6293
6293
  Object.values(this.audioElements).forEach(audioElement => {
6294
6294
  if (audioElement instanceof HTMLAudioElement) {
@@ -6300,7 +6300,7 @@ class WebRTCClient extends Emitter {
6300
6300
  }
6301
6301
 
6302
6302
  changeAudioOutputDevice(id ) {
6303
- logger$3.info('Changing audio output device', { id });
6303
+ logger.info('Changing audio output device', { id });
6304
6304
 
6305
6305
  Object.values(this.audioElements).forEach(audioElement => {
6306
6306
  // `setSinkId` method is not included in any flow type definitions for HTMLAudioElements but is a valid method
@@ -6317,7 +6317,7 @@ class WebRTCClient extends Emitter {
6317
6317
 
6318
6318
  changeAudioInputDevice(id , session ) {
6319
6319
  const currentId = this.getAudioDeviceId();
6320
- logger$3.info('setting audio input device', { id, currentId, session: !!session });
6320
+ logger.info('setting audio input device', { id, currentId, session: !!session });
6321
6321
 
6322
6322
  if (id === currentId) {
6323
6323
  return null;
@@ -6363,7 +6363,7 @@ class WebRTCClient extends Emitter {
6363
6363
 
6364
6364
  setVideoInputDevice(id ) {
6365
6365
  const currentId = this.getVideoDeviceId();
6366
- logger$3.info('setting video input device', { id, currentId });
6366
+ logger.info('setting video input device', { id, currentId });
6367
6367
 
6368
6368
  if (id === currentId) {
6369
6369
  return null;
@@ -6388,7 +6388,7 @@ class WebRTCClient extends Emitter {
6388
6388
  const sessionId = this.getSipSessionId(session);
6389
6389
  const localStream = this.getLocalStream(sessionId);
6390
6390
 
6391
- logger$3.info('changing video input device', { id, sessionId });
6391
+ logger.info('changing video input device', { id, sessionId });
6392
6392
 
6393
6393
  // Release old video stream
6394
6394
  if (localStream) {
@@ -6456,7 +6456,7 @@ class WebRTCClient extends Emitter {
6456
6456
  const shouldDoScreenSharing = newConstraints && newConstraints.screen;
6457
6457
  const desktop = newConstraints && newConstraints.desktop;
6458
6458
 
6459
- logger$3.info('Sending reinvite', {
6459
+ logger.info('Sending reinvite', {
6460
6460
  id: this.getSipSessionId(sipSession),
6461
6461
  newConstraints,
6462
6462
  conference,
@@ -6494,7 +6494,7 @@ class WebRTCClient extends Emitter {
6494
6494
  sipSession.incomingInviteRequest.message.body = response.message.body;
6495
6495
  }
6496
6496
 
6497
- logger$3.info('on re-INVITE accepted', {
6497
+ logger.info('on re-INVITE accepted', {
6498
6498
  id: this.getSipSessionId(sipSession),
6499
6499
  wasMuted,
6500
6500
  shouldDoScreenSharing,
@@ -6669,7 +6669,7 @@ class WebRTCClient extends Emitter {
6669
6669
  }
6670
6670
 
6671
6671
  startHeartbeat() {
6672
- logger$3.info('sdk webrtc start heartbeat', { userAgent: !!this.userAgent });
6672
+ logger.info('sdk webrtc start heartbeat', { userAgent: !!this.userAgent });
6673
6673
  if (!this.userAgent) {
6674
6674
  this.heartbeat.stop();
6675
6675
  return;
@@ -6682,7 +6682,7 @@ class WebRTCClient extends Emitter {
6682
6682
  }
6683
6683
 
6684
6684
  stopHeartbeat() {
6685
- logger$3.info('sdk webrtc stop heartbeat');
6685
+ logger.info('sdk webrtc stop heartbeat');
6686
6686
  this.heartbeat.stop();
6687
6687
  }
6688
6688
 
@@ -6703,7 +6703,7 @@ class WebRTCClient extends Emitter {
6703
6703
  }
6704
6704
 
6705
6705
  attemptReconnection() {
6706
- logger$3.info('attempt reconnection', { userAgent: !!this.userAgent });
6706
+ logger.info('attempt reconnection', { userAgent: !!this.userAgent });
6707
6707
  if (!this.userAgent) {
6708
6708
  return;
6709
6709
  }
@@ -6728,7 +6728,7 @@ class WebRTCClient extends Emitter {
6728
6728
  return;
6729
6729
  }
6730
6730
 
6731
- logger$3.info('setting local media stream', {
6731
+ logger.info('setting local media stream', {
6732
6732
  sipSessionId,
6733
6733
  tracks: newStream ? newStream.getTracks() : null,
6734
6734
  });
@@ -6745,7 +6745,7 @@ class WebRTCClient extends Emitter {
6745
6745
 
6746
6746
  const oldStream = this.getLocalStream(sipSessionId);
6747
6747
 
6748
- logger$3.info('updating local stream', {
6748
+ logger.info('updating local stream', {
6749
6749
  sipSessionId,
6750
6750
  oldStream: !!oldStream,
6751
6751
  tracks: newStream.getTracks(),
@@ -6765,7 +6765,7 @@ class WebRTCClient extends Emitter {
6765
6765
  const remoteStream = this.getRemoteStream(sessionId);
6766
6766
  const pc = this.getPeerConnection(sessionId);
6767
6767
 
6768
- logger$3.info('Updating remote stream', {
6768
+ logger.info('Updating remote stream', {
6769
6769
  sessionId,
6770
6770
  tracks: remoteStream ? remoteStream.getTracks() : null,
6771
6771
  receiverTracks: pc && pc.getReceivers ? pc.getReceivers().map(receiver => receiver.track) : null,
@@ -6790,14 +6790,16 @@ class WebRTCClient extends Emitter {
6790
6790
  const screenSharing = constraints && 'screen' in constraints ? constraints.screen : false;
6791
6791
  const isDesktop = constraints && 'desktop' in constraints ? constraints.desktop : false;
6792
6792
  const withAudio = constraints && 'audio' in constraints ? constraints.audio : true;
6793
+ const mandatoryVideo = constraints && typeof constraints.video === 'object' ? constraints.video.mandatory : {};
6793
6794
 
6794
- logger$3.info('Retrieving media a configuration', { enableVideo, screenSharing, isDesktop, withAudio, constraints });
6795
+ logger.info('Retrieving media a configuration', { enableVideo, screenSharing, isDesktop, withAudio, constraints });
6795
6796
 
6796
6797
  return {
6797
6798
  constraints: {
6798
6799
  // Exact constraint are not supported with `getDisplayMedia` and we must have a video=false in desktop screenshare
6799
6800
  audio: screenSharing ? !isDesktop : (withAudio ? this._getAudioConstraints() : false),
6800
- video: screenSharing ? (isDesktop ? ({ mandatory: { chromeMediaSource: 'desktop' } }) : { cursor: 'always' })
6801
+ video: screenSharing ? (isDesktop
6802
+ ? ({ mandatory: { chromeMediaSource: 'desktop', ...(mandatoryVideo || {}) } }) : { cursor: 'always' })
6801
6803
  : this._getVideoConstraints(enableVideo),
6802
6804
  screen: screenSharing,
6803
6805
  desktop: isDesktop,
@@ -6840,7 +6842,7 @@ class WebRTCClient extends Emitter {
6840
6842
  }
6841
6843
 
6842
6844
  _onTransportError() {
6843
- logger$3.error('on transport error');
6845
+ logger.error('on transport error');
6844
6846
  this.eventEmitter.emit(TRANSPORT_ERROR);
6845
6847
  this.attemptReconnection();
6846
6848
  }
@@ -6849,7 +6851,7 @@ class WebRTCClient extends Emitter {
6849
6851
  const body = message && typeof message === 'object' ? message.data : message;
6850
6852
  if (body && body.indexOf('200 OK') !== -1) {
6851
6853
  if (this.hasHeartbeat()) {
6852
- logger$3.info('on heartbeat received from Asterisk', { hasHeartbeat: this.hasHeartbeat() });
6854
+ logger.info('on heartbeat received from Asterisk', { hasHeartbeat: this.hasHeartbeat() });
6853
6855
 
6854
6856
  this.heartbeat.onHeartbeat();
6855
6857
  if (this.heartbeatCb) {
@@ -6860,7 +6862,7 @@ class WebRTCClient extends Emitter {
6860
6862
  }
6861
6863
 
6862
6864
  async _onHeartbeatTimeout() {
6863
- logger$3.info('sdk webrtc heartbeat timed out', { userAgent: !!this.userAgent, cb: !!this.heartbeatTimeoutCb });
6865
+ logger.info('sdk webrtc heartbeat timed out', { userAgent: !!this.userAgent, cb: !!this.heartbeatTimeoutCb });
6864
6866
 
6865
6867
  if (this.heartbeatTimeoutCb) {
6866
6868
  this.heartbeatTimeoutCb();
@@ -6872,7 +6874,7 @@ class WebRTCClient extends Emitter {
6872
6874
  try {
6873
6875
  await this.userAgent.transport.disconnect();
6874
6876
  } catch (e) {
6875
- logger$3.error('Transport disconnection after heartbeat timeout, error', e);
6877
+ logger.error('Transport disconnection after heartbeat timeout, error', e);
6876
6878
  }
6877
6879
  }
6878
6880
 
@@ -6905,31 +6907,31 @@ class WebRTCClient extends Emitter {
6905
6907
  }
6906
6908
 
6907
6909
  _connectIfNeeded() {
6908
- logger$3.info('connect if needed, checking', { connected: this.isConnected() });
6910
+ logger.info('connect if needed, checking', { connected: this.isConnected() });
6909
6911
  if (!this.userAgent) {
6910
- logger$3.info('need to recreate User Agent');
6912
+ logger.info('need to recreate User Agent');
6911
6913
  this.userAgent = this.createUserAgent(this.uaConfigOverrides);
6912
6914
  }
6913
6915
 
6914
6916
  if (this.isConnected()) {
6915
- logger$3.info('webrtc sdk, already connected');
6917
+ logger.info('webrtc sdk, already connected');
6916
6918
  return Promise.resolve();
6917
6919
  }
6918
6920
 
6919
6921
  if (this.isConnecting()) {
6920
- logger$3.info('webrtc sdk, already connecting...');
6922
+ logger.info('webrtc sdk, already connecting...');
6921
6923
 
6922
6924
  this.connectionPromise = this.userAgent.transport.connectPromise;
6923
6925
  return this.connectionPromise;
6924
6926
  }
6925
6927
 
6926
6928
  if (this.connectionPromise) {
6927
- logger$3.info('webrtc sdk, connection promise connecting...');
6929
+ logger.info('webrtc sdk, connection promise connecting...');
6928
6930
  // $FlowFixMe
6929
6931
  return this.connectionPromise;
6930
6932
  }
6931
6933
 
6932
- logger$3.info('WebRTC UA needs to connect');
6934
+ logger.info('WebRTC UA needs to connect');
6933
6935
 
6934
6936
  // Force UA to reconnect
6935
6937
  if (this.userAgent && this.userAgent.state !== userAgentState.UserAgentState.Stopped) {
@@ -7054,7 +7056,7 @@ class WebRTCClient extends Emitter {
7054
7056
 
7055
7057
  sdh.peerConnectionDelegate = {
7056
7058
  onicecandidateerror: (error ) => {
7057
- logger$3.error('on icecandidate error', {
7059
+ logger.error('on icecandidate error', {
7058
7060
  address: error.address,
7059
7061
  port: error.port,
7060
7062
  errorCode: error.errorCode,
@@ -7083,7 +7085,7 @@ class WebRTCClient extends Emitter {
7083
7085
  updatedNumber = session.assertedIdentity.uri.normal.user;
7084
7086
  updatedCalleeName = session.assertedIdentity.displayName || updatedNumber;
7085
7087
  }
7086
- logger$3.info('re-invite received', { updatedCalleeName, updatedNumber, hadRemoteVideo });
7088
+ logger.info('re-invite received', { updatedCalleeName, updatedNumber, hadRemoteVideo });
7087
7089
 
7088
7090
  // Useful to know if it's a video upgrade or an unhold from a remote peer with a video stream
7089
7091
 
@@ -7104,7 +7106,7 @@ class WebRTCClient extends Emitter {
7104
7106
  }
7105
7107
 
7106
7108
  _onAccepted(session , sessionDialog , withEvent = true) {
7107
- logger$3.info('on call accepted', { id: session.id, remoteTag: session.remoteTag });
7109
+ logger.info('on call accepted', { id: session.id, remoteTag: session.remoteTag });
7108
7110
 
7109
7111
  this.storeSipSession(session);
7110
7112
 
@@ -7116,7 +7118,7 @@ class WebRTCClient extends Emitter {
7116
7118
  const onTrack = (event ) => {
7117
7119
  const isAudioOnly = this._isAudioOnly(session);
7118
7120
  const { kind, label, readyState, id, muted } = event.track;
7119
- logger$3.info('on track event', { isAudioOnly, kind, label, readyState, id, muted });
7121
+ logger.info('on track event', { isAudioOnly, kind, label, readyState, id, muted });
7120
7122
 
7121
7123
  // Stop video track in audio only mode
7122
7124
  if (isAudioOnly && kind === 'video') {
@@ -7132,12 +7134,14 @@ class WebRTCClient extends Emitter {
7132
7134
 
7133
7135
  session.sessionDescriptionHandler.remoteMediaStream.onaddtrack = onTrack;
7134
7136
 
7135
- pc.oniceconnectionstatechange = () => {
7136
- logger$3.info('on ice connection state changed', { state: pc.iceConnectionState });
7137
- if (pc.iceConnectionState === 'disconnected') {
7138
- this.eventEmitter.emit(ON_DISCONNECTED);
7139
- }
7140
- };
7137
+ if (pc) {
7138
+ pc.oniceconnectionstatechange = () => {
7139
+ logger.info('on ice connection state changed', { state: pc.iceConnectionState });
7140
+ if (pc.iceConnectionState === 'disconnected') {
7141
+ this.eventEmitter.emit(ON_DISCONNECTED);
7142
+ }
7143
+ };
7144
+ }
7141
7145
 
7142
7146
  if (withEvent) {
7143
7147
  this.eventEmitter.emit(ACCEPTED, session, sessionDialog);
@@ -7306,10 +7310,10 @@ class WebRTCClient extends Emitter {
7306
7310
 
7307
7311
  _stopSendingStats(session ) {
7308
7312
  const sessionId = this.getSipSessionId(session);
7309
- logger$3.trace('Check for stopping stats', { sessionId, ids: Object.keys(this.statsIntervals) });
7313
+ logger.trace('Check for stopping stats', { sessionId, ids: Object.keys(this.statsIntervals) });
7310
7314
 
7311
7315
  if (sessionId in this.statsIntervals) {
7312
- logger$3.trace('Stop sending stats for call', { sessionId });
7316
+ logger.trace('Stop sending stats for call', { sessionId });
7313
7317
  this.statsIntervals[sessionId]();
7314
7318
  delete this.statsIntervals[sessionId];
7315
7319
  }
@@ -7325,7 +7329,7 @@ class WebRTCClient extends Emitter {
7325
7329
  try {
7326
7330
  await this.userAgent.transport.disconnect();
7327
7331
  } catch (e) {
7328
- logger$3.error('WebRTC transport disconnect, error', e);
7332
+ logger.error('WebRTC transport disconnect, error', e);
7329
7333
  }
7330
7334
  }
7331
7335
  }
@@ -7347,13 +7351,17 @@ class WebRTCClient extends Emitter {
7347
7351
  const nbStats = this.sessionNetworkStats[sessionId].length;
7348
7352
  const lastNetworkStats = this.sessionNetworkStats[sessionId][nbStats - 1];
7349
7353
  const lastAudioSent = lastNetworkStats ? lastNetworkStats.audioBytesSent : 0;
7354
+ const lastAudioContentSent = lastNetworkStats ? lastNetworkStats.audioContentSent : 0;
7350
7355
  const lastVideoSent = lastNetworkStats ? lastNetworkStats.videoBytesSent : 0;
7351
7356
  const lastAudioReceived = lastNetworkStats ? lastNetworkStats.audioBytesReceived : 0;
7357
+ const lastAudioContentReceived = lastNetworkStats ? lastNetworkStats.audioContentReceived : 0;
7352
7358
  const lastVideoReceived = lastNetworkStats ? lastNetworkStats.videoBytesReceived : 0;
7353
7359
  const lastTransportSent = lastNetworkStats ? lastNetworkStats.transportSent : 0;
7354
7360
  const lastTransportReceived = lastNetworkStats ? lastNetworkStats.transportReceived : 0;
7355
- let audioBytesSent = 0;
7356
- let audioBytesReceived = 0;
7361
+ let audioBytesSent = 0; // content + header
7362
+ let audioBytesReceived = 0; // content + header
7363
+ let audioContentSent = 0; // useful to detect blank call
7364
+ let audioContentReceived = 0;
7357
7365
  let videoBytesSent = 0;
7358
7366
  let videoBytesReceived = 0;
7359
7367
  let transportSent = 0;
@@ -7363,6 +7371,7 @@ class WebRTCClient extends Emitter {
7363
7371
  stats.forEach(report => {
7364
7372
  if (report.type === 'outbound-rtp' && report.kind === 'audio') {
7365
7373
  audioBytesSent += Number(report.bytesSent) + Number(report.headerBytesSent);
7374
+ audioContentSent += Number(report.bytesSent);
7366
7375
  }
7367
7376
  if (report.type === 'remote-outbound-rtp' && report.kind === 'audio') {
7368
7377
  audioBytesSent += Number(report.bytesSent);
@@ -7374,6 +7383,7 @@ class WebRTCClient extends Emitter {
7374
7383
  packetsLost += Number(report.packetsLost);
7375
7384
  networkStats.packetsReceived = Number(report.packetsReceived);
7376
7385
  audioBytesReceived += Number(report.bytesReceived) + Number(report.headerBytesReceived);
7386
+ audioContentReceived += Number(report.bytesReceived);
7377
7387
  }
7378
7388
  if (report.type === 'inbound-rtp' && report.kind === 'video') {
7379
7389
  videoBytesReceived += Number(report.bytesReceived) + Number(report.headerBytesReceived);
@@ -7402,10 +7412,17 @@ class WebRTCClient extends Emitter {
7402
7412
  });
7403
7413
 
7404
7414
  networkStats.packetsLost = packetsLost;
7415
+
7405
7416
  networkStats.totalAudioBytesSent = audioBytesSent;
7406
7417
  networkStats.audioBytesSent = audioBytesSent - lastAudioSent;
7407
7418
  networkStats.totalAudioBytesReceived = audioBytesReceived - lastAudioReceived;
7408
7419
  networkStats.audioBytesReceived = audioBytesReceived;
7420
+
7421
+ networkStats.totalAudioContentSent = audioContentSent;
7422
+ networkStats.audioContentSent = audioContentSent - lastAudioContentSent;
7423
+ networkStats.totalAudioBytesReceived = audioContentReceived - lastAudioContentReceived;
7424
+ networkStats.audioContentReceived = audioContentReceived;
7425
+
7409
7426
  networkStats.totalVideoBytesSent = videoBytesSent;
7410
7427
  networkStats.videoBytesSent = videoBytesSent - lastVideoSent;
7411
7428
  networkStats.totalVideoBytesReceived = videoBytesReceived;