@wazo/sdk 0.37.24 → 0.37.28

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 (129) hide show
  1. package/README.md +96 -58
  2. package/dist/wazo-sdk.js +6 -6
  3. package/esm/__tests__/api-client.test.js +14 -14
  4. package/esm/__tests__/web-rtc-client.test.js +130 -108
  5. package/esm/api/agentd.js +1 -1
  6. package/esm/api/amid.js +2 -2
  7. package/esm/api/application.js +1 -1
  8. package/esm/api/auth.js +1 -1
  9. package/esm/api/call-logd.js +3 -3
  10. package/esm/api/calld.js +1 -1
  11. package/esm/api/chatd.js +1 -1
  12. package/esm/api/confd.js +1 -1
  13. package/esm/api/ctid-ng.js +4 -4
  14. package/esm/api/dird.js +3 -3
  15. package/esm/api/webhookd.js +2 -2
  16. package/esm/api-client.js +14 -14
  17. package/esm/checker/Checker.js +155 -133
  18. package/esm/checker/checks/aor.js +14 -14
  19. package/esm/checker/checks/api.js +14 -14
  20. package/esm/checker/checks/index.js +145 -123
  21. package/esm/checker/checks/wazo-websocket.js +16 -16
  22. package/esm/checker/checks/webrtc-transport.js +130 -108
  23. package/esm/checker/checks/webrtc.js +130 -108
  24. package/esm/domain/AdHocAPIConference.js +14 -14
  25. package/esm/domain/CallLog.js +1 -1
  26. package/esm/domain/CallSession.js +15 -0
  27. package/esm/domain/Contact.js +2 -2
  28. package/esm/domain/Features.js +14 -14
  29. package/esm/domain/Phone/CTIPhone.js +43 -28
  30. package/esm/domain/Phone/WebRTCPhone.js +126 -90
  31. package/esm/domain/SFUNotAvailableError.js +9 -0
  32. package/esm/domain/__tests__/CallLog.test.js +1 -1
  33. package/esm/domain/__tests__/CallSession.test.js +15 -0
  34. package/esm/domain/__tests__/Contact.test.js +2 -2
  35. package/esm/domain/__tests__/IndirectTransfer.test.js +15 -0
  36. package/esm/domain/__tests__/Room.test.js +15 -0
  37. package/esm/index.js +415 -346
  38. package/esm/lib/WazoSessionDescriptionHandler.js +10 -5
  39. package/esm/service/CallApi.js +14 -14
  40. package/esm/service/IssueReporter.js +2 -2
  41. package/esm/service/__tests__/IssueReporter.test.js +2 -2
  42. package/esm/service/getApiClient.js +14 -14
  43. package/esm/simple/Auth.js +404 -336
  44. package/esm/simple/Configuration.js +404 -336
  45. package/esm/simple/Directory.js +14 -14
  46. package/esm/simple/Phone.js +404 -336
  47. package/esm/simple/Websocket.js +18 -18
  48. package/esm/simple/index.js +408 -340
  49. package/esm/simple/room/LocalParticipant.js +408 -340
  50. package/esm/simple/room/Participant.js +408 -340
  51. package/esm/simple/room/RemoteParticipant.js +408 -340
  52. package/esm/simple/room/Room.js +409 -341
  53. package/esm/simple/room/SipRoom.js +408 -340
  54. package/esm/simple/room/Stream.js +408 -340
  55. package/esm/simple/room/__tests__/RemoteParticipant.test.js +408 -340
  56. package/esm/simple/utils.js +408 -340
  57. package/esm/utils/__tests__/api-requester.test.js +1 -1
  58. package/esm/utils/api-requester.js +1 -1
  59. package/esm/web-rtc-client.js +130 -108
  60. package/esm/websocket-client.js +16 -16
  61. package/lib/__tests__/api-client.test.js +14 -14
  62. package/lib/__tests__/web-rtc-client.test.js +130 -108
  63. package/lib/api/agentd.js +1 -1
  64. package/lib/api/amid.js +2 -2
  65. package/lib/api/application.js +1 -1
  66. package/lib/api/auth.js +1 -1
  67. package/lib/api/call-logd.js +3 -3
  68. package/lib/api/calld.js +1 -1
  69. package/lib/api/chatd.js +1 -1
  70. package/lib/api/confd.js +1 -1
  71. package/lib/api/ctid-ng.js +4 -4
  72. package/lib/api/dird.js +3 -3
  73. package/lib/api/webhookd.js +2 -2
  74. package/lib/api-client.js +14 -14
  75. package/lib/checker/Checker.js +155 -133
  76. package/lib/checker/checks/aor.js +14 -14
  77. package/lib/checker/checks/api.js +14 -14
  78. package/lib/checker/checks/index.js +145 -123
  79. package/lib/checker/checks/wazo-websocket.js +16 -16
  80. package/lib/checker/checks/webrtc-transport.js +130 -108
  81. package/lib/checker/checks/webrtc.js +130 -108
  82. package/lib/domain/AdHocAPIConference.js +14 -14
  83. package/lib/domain/CallLog.js +1 -1
  84. package/lib/domain/CallSession.js +15 -0
  85. package/lib/domain/Contact.js +2 -2
  86. package/lib/domain/Features.js +14 -14
  87. package/lib/domain/Phone/CTIPhone.js +43 -28
  88. package/lib/domain/Phone/WebRTCPhone.js +126 -89
  89. package/lib/domain/SFUNotAvailableError.js +11 -0
  90. package/lib/domain/__tests__/CallLog.test.js +1 -1
  91. package/lib/domain/__tests__/CallSession.test.js +15 -0
  92. package/lib/domain/__tests__/Contact.test.js +2 -2
  93. package/lib/domain/__tests__/IndirectTransfer.test.js +15 -0
  94. package/lib/domain/__tests__/Room.test.js +15 -0
  95. package/lib/index.js +415 -346
  96. package/lib/lib/WazoSessionDescriptionHandler.js +10 -5
  97. package/lib/service/CallApi.js +14 -14
  98. package/lib/service/IssueReporter.js +2 -2
  99. package/lib/service/__tests__/IssueReporter.test.js +2 -2
  100. package/lib/service/getApiClient.js +14 -14
  101. package/lib/simple/Auth.js +404 -336
  102. package/lib/simple/Configuration.js +404 -336
  103. package/lib/simple/Directory.js +14 -14
  104. package/lib/simple/Phone.js +404 -336
  105. package/lib/simple/Websocket.js +18 -18
  106. package/lib/simple/index.js +408 -340
  107. package/lib/simple/room/LocalParticipant.js +408 -340
  108. package/lib/simple/room/Participant.js +408 -340
  109. package/lib/simple/room/RemoteParticipant.js +408 -340
  110. package/lib/simple/room/Room.js +409 -341
  111. package/lib/simple/room/SipRoom.js +408 -340
  112. package/lib/simple/room/Stream.js +408 -340
  113. package/lib/simple/room/__tests__/RemoteParticipant.test.js +408 -340
  114. package/lib/simple/utils.js +408 -340
  115. package/lib/utils/__tests__/api-requester.test.js +1 -1
  116. package/lib/utils/api-requester.js +1 -1
  117. package/lib/web-rtc-client.js +130 -108
  118. package/lib/websocket-client.js +16 -16
  119. package/package.json +1 -1
  120. package/src/domain/CallSession.js +16 -0
  121. package/src/domain/Contact.js +1 -1
  122. package/src/domain/Phone/WebRTCPhone.js +25 -4
  123. package/src/domain/SFUNotAvailableError.js +7 -0
  124. package/src/index.js +2 -0
  125. package/src/lib/WazoSessionDescriptionHandler.js +8 -3
  126. package/src/simple/Phone.js +2 -1
  127. package/src/simple/index.js +2 -0
  128. package/src/utils/api-requester.js +1 -1
  129. package/src/web-rtc-client.js +27 -10
@@ -100,11 +100,11 @@ const isMobile = () => typeof navigator !== 'undefined' && navigator.product ===
100
100
 
101
101
  const methods = ['head', 'get', 'post', 'put', 'delete'];
102
102
 
103
- const logger = IssueReporter$1 ? IssueReporter$1.loggerFor('api') : console;
103
+ const logger$2 = IssueReporter$1 ? IssueReporter$1.loggerFor('api') : console;
104
104
 
105
105
  // Use a function here to be able to mock it in tests
106
106
  const realFetch = () => {
107
- if (typeof document !== 'undefined') {
107
+ if (typeof document !== 'undefined' && window.fetch) {
108
108
  // Browser
109
109
  return window.fetch;
110
110
  }
@@ -239,7 +239,7 @@ class ApiRequester {
239
239
  };
240
240
 
241
241
  if (this.refreshTokenPromise) {
242
- logger.info('A token is already refreshing, waiting ...', { url });
242
+ logger$2.info('A token is already refreshing, waiting ...', { url });
243
243
  await this.refreshTokenPromise;
244
244
  }
245
245
 
@@ -259,7 +259,7 @@ class ApiRequester {
259
259
  return promise.then(async (err ) => {
260
260
  // Check if the token is still valid
261
261
  if (firstCall && this._checkTokenExpired(response, err)) {
262
- logger.warn('token expired', { error: err.reason });
262
+ logger$2.warn('token expired', { error: err.reason });
263
263
  // Replay the call after refreshing the token
264
264
  return this._replayWithNewToken(err, path, method, body, headers, parse);
265
265
  }
@@ -269,7 +269,7 @@ class ApiRequester {
269
269
  : exceptionClass.fromResponse(err, response.status);
270
270
 
271
271
  if (this.shouldLogErrors) {
272
- logger.error('API error', error);
272
+ logger$2.error('API error', error);
273
273
  }
274
274
 
275
275
  throw error;
@@ -279,7 +279,7 @@ class ApiRequester {
279
279
  return newParse(response, isJson);
280
280
  }).catch(error => {
281
281
  if (this.shouldLogErrors) {
282
- logger.error('Fetch failed', { url, options, message: error.message, stack: error.stack });
282
+ logger$2.error('Fetch failed', { url, options, message: error.message, stack: error.stack });
283
283
  }
284
284
 
285
285
  throw error;
@@ -307,13 +307,13 @@ class ApiRequester {
307
307
  ) {
308
308
  const isTokenNotFound = this._isTokenNotFound(err);
309
309
  let newPath = path;
310
- logger.info('refreshing token', { inProgress: !!this.refreshTokenPromise });
310
+ logger$2.info('refreshing token', { inProgress: !!this.refreshTokenPromise });
311
311
 
312
312
  this.refreshTokenPromise = this.refreshTokenPromise || this.refreshTokenCallback();
313
313
 
314
314
  return this.refreshTokenPromise.then(() => {
315
315
  this.refreshTokenPromise = null;
316
- logger.info('token refreshed', { isTokenNotFound });
316
+ logger$2.info('token refreshed', { isTokenNotFound });
317
317
  if (isTokenNotFound) {
318
318
  const pathParts = path.split('/');
319
319
  pathParts.pop();
@@ -823,11 +823,16 @@ class WazoSessionDescriptionHandler extends SessionDescriptionHandler {
823
823
 
824
824
  // $FlowFixMe
825
825
  setRemoteSessionDescription(sessionDescription ) {
826
- const result = super.setRemoteSessionDescription(sessionDescription);
826
+ try {
827
+ const result = super.setRemoteSessionDescription(sessionDescription);
827
828
 
828
- this.eventEmitter.emit('setDescription', sessionDescription);
829
+ this.eventEmitter.emit('setDescription', sessionDescription);
829
830
 
830
- return result;
831
+ return result;
832
+ } catch (error) {
833
+ this.logger.error('SessionDescriptionHandler.setRemoteSessionDescription error', error);
834
+ throw error;
835
+ }
831
836
  }
832
837
 
833
838
  // Overridden to avoid to fix ice-candidates missing in the SDP in react-native and chrome canary.
@@ -2447,7 +2452,7 @@ class Contact {
2447
2452
  this[key] = old[key] || this[key];
2448
2453
  });
2449
2454
 
2450
- if (old.lineState && !this.lineState) {
2455
+ if (old.lineState) {
2451
2456
  this.lineState = old.lineState;
2452
2457
  }
2453
2458
 
@@ -4138,7 +4143,7 @@ const TRANSFER_FLOW_BLIND = 'blind';
4138
4143
 
4139
4144
  // const MINIMUM_WAZO_ENGINE_VERSION_FOR_CTI_HOLD = '20.11';
4140
4145
 
4141
- const logger$1 = IssueReporter$1 ? IssueReporter$1.loggerFor('cti-phone') : console;
4146
+ IssueReporter$1 ? IssueReporter$1.loggerFor('cti-phone') : console;
4142
4147
 
4143
4148
  /* */
4144
4149
 
@@ -5057,7 +5062,7 @@ const AGENTD_VERSION = '1.0';
5057
5062
  const WEBHOOKD_VERSION = '1.0';
5058
5063
  const AMID_VERSION = '1.0';
5059
5064
 
5060
- const logger$2 = IssueReporter$1 ? IssueReporter$1.loggerFor('api') : console;
5065
+ const logger$1 = IssueReporter$1 ? IssueReporter$1.loggerFor('api') : console;
5061
5066
 
5062
5067
  class ApiClient {
5063
5068
 
@@ -5109,12 +5114,12 @@ class ApiClient {
5109
5114
  }
5110
5115
 
5111
5116
  async forceRefreshToken() {
5112
- logger$2.info('forcing refresh token, calling callback');
5117
+ logger$1.info('forcing refresh token, calling callback');
5113
5118
  return this.refreshTokenCallback();
5114
5119
  }
5115
5120
 
5116
5121
  async refreshTokenCallback() {
5117
- logger$2.info('refresh token callback called', {
5122
+ logger$1.info('refresh token callback called', {
5118
5123
  refreshToken: this.refreshToken,
5119
5124
  refreshBackend: this.refreshBackend,
5120
5125
  refreshExpiration: this.refreshExpiration,
@@ -5132,7 +5137,7 @@ class ApiClient {
5132
5137
  this.isMobile,
5133
5138
  );
5134
5139
 
5135
- logger$2.info('token refreshed', { token: session.token });
5140
+ logger$1.info('token refreshed', { token: session.token });
5136
5141
 
5137
5142
  if (this.onRefreshToken) {
5138
5143
  this.onRefreshToken(session.token, session);
@@ -5305,7 +5310,7 @@ const DEFAULT_ICE_TIMEOUT = 3000;
5305
5310
  const SEND_STATS_DELAY = 5000;
5306
5311
 
5307
5312
  const states = ['STATUS_NULL', 'STATUS_NEW', 'STATUS_CONNECTING', 'STATUS_CONNECTED', 'STATUS_COMPLETED'];
5308
- const logger$3 = IssueReporter$1 ? IssueReporter$1.loggerFor('webrtc-client') : console;
5313
+ const logger = IssueReporter$1 ? IssueReporter$1.loggerFor('webrtc-client') : console;
5309
5314
  const statsLogger = IssueReporter$1 ? IssueReporter$1.loggerFor('webrtc-stats') : console;
5310
5315
 
5311
5316
  // events
@@ -5481,13 +5486,13 @@ class WebRTCClient extends Emitter {
5481
5486
 
5482
5487
  createUserAgent(configOverrides ) {
5483
5488
  const webRTCConfiguration = this._createWebRTCConfiguration(configOverrides);
5484
- logger$3.info('sdk webrtc, creating UA', { webRTCConfiguration });
5489
+ logger.info('sdk webrtc, creating UA', { webRTCConfiguration });
5485
5490
 
5486
5491
  webRTCConfiguration.delegate = {
5487
5492
  onConnect: this.onConnect.bind(this),
5488
5493
  onDisconnect: this.onDisconnect.bind(this),
5489
5494
  onInvite: (invitation ) => {
5490
- logger$3.info('sdk webrtc on invite', {
5495
+ logger.info('sdk webrtc on invite', {
5491
5496
  method: 'delegate.onInvite',
5492
5497
  id: invitation.id,
5493
5498
  remoteURI: invitation.remoteURI,
@@ -5530,7 +5535,7 @@ class WebRTCClient extends Emitter {
5530
5535
  }
5531
5536
 
5532
5537
  onConnect() {
5533
- logger$3.info('sdk webrtc connected', { method: 'delegate.onConnect' });
5538
+ logger.info('sdk webrtc connected', { method: 'delegate.onConnect' });
5534
5539
  this.eventEmitter.emit(CONNECTED);
5535
5540
  if (!this.isRegistered() && this.registerer && this.registerer.waiting) {
5536
5541
  this.registerer.waitingToggle(false);
@@ -5539,7 +5544,7 @@ class WebRTCClient extends Emitter {
5539
5544
  }
5540
5545
 
5541
5546
  async onDisconnect(error ) {
5542
- logger$3.info('sdk webrtc disconnected', { method: 'delegate.onConnect', error });
5547
+ logger.info('sdk webrtc disconnected', { method: 'delegate.onConnect', error });
5543
5548
  this.connectionPromise = null;
5544
5549
  // The UA will attempt to reconnect automatically when an error occurred
5545
5550
  this.eventEmitter.emit(DISCONNECTED, error);
@@ -5564,37 +5569,37 @@ class WebRTCClient extends Emitter {
5564
5569
  };
5565
5570
 
5566
5571
  if (this.skipRegister) {
5567
- logger$3.info('sdk webrtc skip register...', logInfo);
5572
+ logger.info('sdk webrtc skip register...', logInfo);
5568
5573
  return Promise.resolve();
5569
5574
  }
5570
5575
 
5571
- logger$3.info('sdk webrtc registering...', logInfo);
5576
+ logger.info('sdk webrtc registering...', logInfo);
5572
5577
 
5573
5578
  if (!this.userAgent) {
5574
- logger$3.info('sdk webrtc recreating User Agent');
5579
+ logger.info('sdk webrtc recreating User Agent');
5575
5580
  this.userAgent = this.createUserAgent(this.uaConfigOverrides);
5576
5581
  }
5577
5582
  if (!this.userAgent || this.isRegistered()) {
5578
- logger$3.info('sdk webrtc registering aborted, already registered or no UA can be created');
5583
+ logger.info('sdk webrtc registering aborted, already registered or no UA can be created');
5579
5584
  return Promise.resolve();
5580
5585
  }
5581
5586
 
5582
5587
  if (this.connectionPromise || (this.registerer && this.registerer.waiting)) {
5583
- logger$3.info('sdk webrtc registering aborted due to a registration in progress.');
5588
+ logger.info('sdk webrtc registering aborted due to a registration in progress.');
5584
5589
  return Promise.resolve();
5585
5590
  }
5586
5591
 
5587
5592
  const registerOptions = this._isWeb() ? {} : { extraContactHeaderParams: ['mobility=mobile'] };
5588
5593
 
5589
5594
  const onRegisterFailed = () => {
5590
- logger$3.info('sdk webrtc registering failed', { tries, registerer: !!this.registerer });
5595
+ logger.info('sdk webrtc registering failed', { tries, registerer: !!this.registerer });
5591
5596
  this.connectionPromise = null;
5592
5597
  if (this.registerer && this.registerer.waiting) {
5593
5598
  this.registerer.waitingToggle(false);
5594
5599
  }
5595
5600
 
5596
5601
  if (tries <= MAX_REGISTER_TRIES) {
5597
- logger$3.info('sdk webrtc registering, retrying...', { tries });
5602
+ logger.info('sdk webrtc registering, retrying...', { tries });
5598
5603
  setTimeout(() => this.register(tries + 1), 300);
5599
5604
  }
5600
5605
  };
@@ -5603,18 +5608,18 @@ class WebRTCClient extends Emitter {
5603
5608
  // Avoid race condition with the close method called just before register and setting userAgent to null
5604
5609
  // during the resolution of the primise.
5605
5610
  if (!this.userAgent) {
5606
- logger$3.info('sdk webrtc recreating User Agent after connection');
5611
+ logger.info('sdk webrtc recreating User Agent after connection');
5607
5612
  this.userAgent = this.createUserAgent(this.uaConfigOverrides);
5608
5613
  }
5609
5614
 
5610
- logger$3.info('sdk webrtc registering, transport connected', { registerOptions, ua: !!this.userAgent });
5615
+ logger.info('sdk webrtc registering, transport connected', { registerOptions, ua: !!this.userAgent });
5611
5616
  this.registerer = new Registerer(this.userAgent, registerOptions);
5612
5617
  this.connectionPromise = null;
5613
5618
  this._monkeyPatchRegisterer(this.registerer);
5614
5619
 
5615
5620
  // Bind registerer events
5616
5621
  this.registerer.stateChange.addListener(newState => {
5617
- logger$3.info('sdk webrtc registering, state changed', { newState });
5622
+ logger.info('sdk webrtc registering, state changed', { newState });
5618
5623
 
5619
5624
  if (newState === RegistererState.Registered && this.registerer
5620
5625
  && this.registerer.state === RegistererState.Registered) {
@@ -5627,7 +5632,7 @@ class WebRTCClient extends Emitter {
5627
5632
  const options = {
5628
5633
  requestDelegate: {
5629
5634
  onReject: response => {
5630
- logger$3.error('sdk webrtc registering, rejected', { response });
5635
+ logger.error('sdk webrtc registering, rejected', { response });
5631
5636
 
5632
5637
  onRegisterFailed();
5633
5638
  },
@@ -5635,13 +5640,13 @@ class WebRTCClient extends Emitter {
5635
5640
  };
5636
5641
 
5637
5642
  return this.registerer.register(options).catch((e) => {
5638
- logger$3.error('sdk webrtc registering, error', e);
5643
+ logger.error('sdk webrtc registering, error', e);
5639
5644
 
5640
5645
  this.eventEmitter.emit(REGISTRATION_FAILED);
5641
5646
  return e;
5642
5647
  });
5643
5648
  }).catch(error => {
5644
- logger$3.error('sdk webrtc registering, transport error', error);
5649
+ logger.error('sdk webrtc registering, transport error', error);
5645
5650
  onRegisterFailed();
5646
5651
  });
5647
5652
  }
@@ -5670,21 +5675,21 @@ class WebRTCClient extends Emitter {
5670
5675
  }
5671
5676
 
5672
5677
  unregister() {
5673
- logger$3.info('sdk webrtc unregistering..', { userAgent: !!this.userAgent, registerer: !!this.registerer });
5678
+ logger.info('sdk webrtc unregistering..', { userAgent: !!this.userAgent, registerer: !!this.registerer });
5674
5679
  if (!this.registerer) {
5675
5680
  return Promise.resolve();
5676
5681
  }
5677
5682
 
5678
5683
  try {
5679
5684
  return this.registerer.unregister().then(() => {
5680
- logger$3.info('sdk webrtc unregistered');
5685
+ logger.info('sdk webrtc unregistered');
5681
5686
  this._cleanupRegister();
5682
5687
  }).catch(e => {
5683
- logger$3.error('sdk webrtc unregistering, promise error', e);
5688
+ logger.error('sdk webrtc unregistering, promise error', e);
5684
5689
  this._cleanupRegister();
5685
5690
  });
5686
5691
  } catch (e) {
5687
- logger$3.error('sdk webrtc unregistering, error', e);
5692
+ logger.error('sdk webrtc unregistering, error', e);
5688
5693
  // Avoid issue with `undefined is not an object (evaluating 'new.target.prototype')` when triggering a new
5689
5694
  // error when the registerer is in a bad state
5690
5695
  this._cleanupRegister();
@@ -5692,7 +5697,7 @@ class WebRTCClient extends Emitter {
5692
5697
  }
5693
5698
 
5694
5699
  stop() {
5695
- logger$3.info('sdk webrtc stop', { userAgent: !!this.userAgent });
5700
+ logger.info('sdk webrtc stop', { userAgent: !!this.userAgent });
5696
5701
  if (!this.userAgent) {
5697
5702
  return Promise.resolve();
5698
5703
  }
@@ -5700,12 +5705,12 @@ class WebRTCClient extends Emitter {
5700
5705
  return this.userAgent.stop().then(() => {
5701
5706
  return this._cleanupRegister();
5702
5707
  }).catch(e => {
5703
- logger$3.warn('sdk webrtc stop, error', { message: e.message, stack: e.stack });
5708
+ logger.warn('sdk webrtc stop, error', { message: e.message, stack: e.stack });
5704
5709
  });
5705
5710
  }
5706
5711
 
5707
5712
  call(number , enableVideo , audioOnly = false, conference = false) {
5708
- logger$3.info('sdk webrtc creating call', { number, enableVideo, audioOnly });
5713
+ logger.info('sdk webrtc creating call', { number, enableVideo, audioOnly, conference });
5709
5714
  const inviterOptions = {
5710
5715
  sessionDescriptionHandlerOptionsReInvite: {
5711
5716
  conference,
@@ -5736,7 +5741,7 @@ class WebRTCClient extends Emitter {
5736
5741
  this._onAccepted(session, response.session, true);
5737
5742
  },
5738
5743
  onReject: (response ) => {
5739
- logger$3.info('on call rejected', { id: session.id, fromTag: session.fromTag });
5744
+ logger.info('on call rejected', { id: session.id, fromTag: session.fromTag });
5740
5745
  this._stopSendingStats(session);
5741
5746
  this.stopNetworkMonitoring(session);
5742
5747
 
@@ -5759,11 +5764,11 @@ class WebRTCClient extends Emitter {
5759
5764
  }
5760
5765
 
5761
5766
  answer(session , enableVideo ) {
5762
- logger$3.info('sdk webrtc answer call', { id: session.id, enableVideo });
5767
+ logger.info('sdk webrtc answer call', { id: session.id, enableVideo });
5763
5768
 
5764
5769
  if (!session || !session.accept) {
5765
5770
  const error = 'No session to answer, or not an invitation';
5766
- logger$3.warn(error);
5771
+ logger.warn(error);
5767
5772
  return Promise.reject(new Error(error));
5768
5773
  }
5769
5774
  const options = {
@@ -5773,15 +5778,15 @@ class WebRTCClient extends Emitter {
5773
5778
  return session.accept(options).then(() => {
5774
5779
  if (session.isCanceled) {
5775
5780
  const message = 'accepted a canceled session (or was canceled during the accept phase).';
5776
- logger$3.error(message, { id: session.id });
5781
+ logger.error(message, { id: session.id });
5777
5782
  this.onCallEnded(session);
5778
5783
 
5779
5784
  throw new CanceledCallError(message);
5780
5785
  }
5781
- logger$3.info('sdk webrtc answer, accepted.');
5786
+ logger.info('sdk webrtc answer, accepted.');
5782
5787
  this._onAccepted(session);
5783
5788
  }).catch(e => {
5784
- logger$3.error(`answer call error for ${session ? session.id : 'n/a'}`, e);
5789
+ logger.error(`answer call error for ${session ? session.id : 'n/a'}`, e);
5785
5790
 
5786
5791
  throw e;
5787
5792
  });
@@ -5789,7 +5794,7 @@ class WebRTCClient extends Emitter {
5789
5794
 
5790
5795
  hangup(session ) {
5791
5796
  const { state, id } = session;
5792
- logger$3.info('sdk webrtc hangup call', { id, state });
5797
+ logger.info('sdk webrtc hangup call', { id, state });
5793
5798
 
5794
5799
  try {
5795
5800
  this._stopSendingStats(session);
@@ -5818,7 +5823,7 @@ class WebRTCClient extends Emitter {
5818
5823
 
5819
5824
  return bye();
5820
5825
  } catch (error) {
5821
- logger$3.warn('sdk webrtc hangup, error', error);
5826
+ logger.warn('sdk webrtc hangup, error', error);
5822
5827
  }
5823
5828
 
5824
5829
  return null;
@@ -5836,7 +5841,7 @@ class WebRTCClient extends Emitter {
5836
5841
  // Fetch and emit an event at `interval` with session network stats
5837
5842
  startNetworkMonitoring(session , interval = 1000) {
5838
5843
  const sessionId = this.getSipSessionId(session);
5839
- logger$3.info('starting network inspection', { id: sessionId });
5844
+ logger.info('starting network inspection', { id: sessionId });
5840
5845
 
5841
5846
  this.sessionNetworkStats[sessionId] = [];
5842
5847
 
@@ -5846,7 +5851,7 @@ class WebRTCClient extends Emitter {
5846
5851
  stopNetworkMonitoring(session ) {
5847
5852
  const sessionId = this.getSipSessionId(session);
5848
5853
  const exists = sessionId in this.networkMonitoringInterval;
5849
- logger$3.info('stopping network inspection', { id: sessionId, exists });
5854
+ logger.info('stopping network inspection', { id: sessionId, exists });
5850
5855
 
5851
5856
  if (exists) {
5852
5857
  clearInterval(this.networkMonitoringInterval[sessionId]);
@@ -5856,17 +5861,17 @@ class WebRTCClient extends Emitter {
5856
5861
  }
5857
5862
 
5858
5863
  reject(session ) {
5859
- logger$3.info('sdk webrtc reject call', { id: session.id });
5864
+ logger.info('sdk webrtc reject call', { id: session.id });
5860
5865
 
5861
5866
  try {
5862
5867
  return session.reject ? session.reject() : session.cancel();
5863
5868
  } catch (e) {
5864
- logger$3.warn('Error when rejecting call', e.message, e.stack);
5869
+ logger.warn('Error when rejecting call', e.message, e.stack);
5865
5870
  }
5866
5871
  }
5867
5872
 
5868
5873
  async close() {
5869
- logger$3.info('sdk webrtc closing client', { userAgent: !!this.userAgent });
5874
+ logger.info('sdk webrtc closing client', { userAgent: !!this.userAgent });
5870
5875
  this._cleanupMedia();
5871
5876
  this.connectionPromise = null;
5872
5877
 
@@ -5897,7 +5902,7 @@ class WebRTCClient extends Emitter {
5897
5902
  // eg: "INVITE not rejectable in state Completed"
5898
5903
  }
5899
5904
  this.userAgent = null;
5900
- logger$3.info('sdk webrtc client closed');
5905
+ logger.info('sdk webrtc client closed');
5901
5906
  }
5902
5907
 
5903
5908
  getNumber(session ) {
@@ -5910,13 +5915,13 @@ class WebRTCClient extends Emitter {
5910
5915
  }
5911
5916
 
5912
5917
  mute(session ) {
5913
- logger$3.info('sdk webrtc mute', { id: session.id });
5918
+ logger.info('sdk webrtc mute', { id: session.id });
5914
5919
 
5915
5920
  this._toggleAudio(session, true);
5916
5921
  }
5917
5922
 
5918
5923
  unmute(session ) {
5919
- logger$3.info('sdk webrtc unmute', { id: session.id });
5924
+ logger.info('sdk webrtc unmute', { id: session.id });
5920
5925
 
5921
5926
  this._toggleAudio(session, false);
5922
5927
  }
@@ -5956,13 +5961,13 @@ class WebRTCClient extends Emitter {
5956
5961
  }
5957
5962
 
5958
5963
  toggleCameraOn(session ) {
5959
- logger$3.info('sdk webrtc toggle camera on', { id: session.id });
5964
+ logger.info('sdk webrtc toggle camera on', { id: session.id });
5960
5965
 
5961
5966
  this._toggleVideo(session, false);
5962
5967
  }
5963
5968
 
5964
5969
  toggleCameraOff(session ) {
5965
- logger$3.info('sdk webrtc toggle camera off', { id: session.id });
5970
+ logger.info('sdk webrtc toggle camera off', { id: session.id });
5966
5971
 
5967
5972
  this._toggleVideo(session, true);
5968
5973
  }
@@ -5971,7 +5976,7 @@ class WebRTCClient extends Emitter {
5971
5976
  const sessionId = this.getSipSessionId(session);
5972
5977
  const hasVideo = hadVideo || this.hasLocalVideo(sessionId);
5973
5978
 
5974
- logger$3.info('sdk webrtc hold', {
5979
+ logger.info('sdk webrtc hold', {
5975
5980
  sessionId,
5976
5981
  keys: Object.keys(this.heldSessions),
5977
5982
  pendingReinvite: !!session.pendingReinvite,
@@ -6020,7 +6025,7 @@ class WebRTCClient extends Emitter {
6020
6025
  const sessionId = this.getSipSessionId(session);
6021
6026
  const hasVideo = sessionId in this.heldSessions && this.heldSessions[sessionId].hasVideo;
6022
6027
 
6023
- logger$3.info('sdk webrtc unhold', {
6028
+ logger.info('sdk webrtc unhold', {
6024
6029
  sessionId,
6025
6030
  keys: Object.keys(this.heldSessions),
6026
6031
  pendingReinvite: !!session.pendingReinvite,
@@ -6168,7 +6173,7 @@ class WebRTCClient extends Emitter {
6168
6173
  if (!session.sessionDescriptionHandler) {
6169
6174
  return;
6170
6175
  }
6171
- logger$3.info('Sending DTMF', {
6176
+ logger.info('Sending DTMF', {
6172
6177
  id: this.getSipSessionId(session),
6173
6178
  tone,
6174
6179
  });
@@ -6184,7 +6189,7 @@ class WebRTCClient extends Emitter {
6184
6189
  transfer(session , target ) {
6185
6190
  this.hold(session);
6186
6191
 
6187
- logger$3.info('Transfering a session', {
6192
+ logger.info('Transfering a session', {
6188
6193
  id: this.getSipSessionId(session),
6189
6194
  target,
6190
6195
  });
@@ -6206,17 +6211,17 @@ class WebRTCClient extends Emitter {
6206
6211
  atxfer(session ) {
6207
6212
  this.hold(session);
6208
6213
 
6209
- logger$3.info('webrtc transfer started', { id: this.getSipSessionId(session) });
6214
+ logger.info('webrtc transfer started', { id: this.getSipSessionId(session) });
6210
6215
 
6211
6216
  const result = {
6212
6217
  newSession: null,
6213
6218
  init: async (target ) => {
6214
- logger$3.info('webrtc transfer initialized', { id: this.getSipSessionId(session), target });
6219
+ logger.info('webrtc transfer initialized', { id: this.getSipSessionId(session), target });
6215
6220
 
6216
6221
  result.newSession = await this.call(target);
6217
6222
  },
6218
6223
  complete: () => {
6219
- logger$3.info('webrtc transfer completed', {
6224
+ logger.info('webrtc transfer completed', {
6220
6225
  id: this.getSipSessionId(session),
6221
6226
  referId: this.getSipSessionId(result.newSession),
6222
6227
  });
@@ -6237,7 +6242,7 @@ class WebRTCClient extends Emitter {
6237
6242
  return;
6238
6243
  }
6239
6244
 
6240
- logger$3.info('send WebRTC message', { sipId: sipSession.id, contentType });
6245
+ logger.info('send WebRTC message', { sipId: sipSession.id, contentType });
6241
6246
 
6242
6247
  try {
6243
6248
  sipSession.message({
@@ -6279,7 +6284,7 @@ class WebRTCClient extends Emitter {
6279
6284
  }
6280
6285
 
6281
6286
  changeAudioOutputVolume(volume ) {
6282
- logger$3.info('Changing audio output volume', { volume });
6287
+ logger.info('Changing audio output volume', { volume });
6283
6288
 
6284
6289
  Object.values(this.audioElements).forEach(audioElement => {
6285
6290
  if (audioElement instanceof HTMLAudioElement) {
@@ -6291,7 +6296,7 @@ class WebRTCClient extends Emitter {
6291
6296
  }
6292
6297
 
6293
6298
  changeAudioOutputDevice(id ) {
6294
- logger$3.info('Changing audio output device', { id });
6299
+ logger.info('Changing audio output device', { id });
6295
6300
 
6296
6301
  Object.values(this.audioElements).forEach(audioElement => {
6297
6302
  // `setSinkId` method is not included in any flow type definitions for HTMLAudioElements but is a valid method
@@ -6308,7 +6313,7 @@ class WebRTCClient extends Emitter {
6308
6313
 
6309
6314
  changeAudioInputDevice(id , session ) {
6310
6315
  const currentId = this.getAudioDeviceId();
6311
- logger$3.info('setting audio input device', { id, currentId, session: !!session });
6316
+ logger.info('setting audio input device', { id, currentId, session: !!session });
6312
6317
 
6313
6318
  if (id === currentId) {
6314
6319
  return null;
@@ -6354,7 +6359,7 @@ class WebRTCClient extends Emitter {
6354
6359
 
6355
6360
  setVideoInputDevice(id ) {
6356
6361
  const currentId = this.getVideoDeviceId();
6357
- logger$3.info('setting video input device', { id, currentId });
6362
+ logger.info('setting video input device', { id, currentId });
6358
6363
 
6359
6364
  if (id === currentId) {
6360
6365
  return null;
@@ -6379,7 +6384,7 @@ class WebRTCClient extends Emitter {
6379
6384
  const sessionId = this.getSipSessionId(session);
6380
6385
  const localStream = this.getLocalStream(sessionId);
6381
6386
 
6382
- logger$3.info('changing video input device', { id, sessionId });
6387
+ logger.info('changing video input device', { id, sessionId });
6383
6388
 
6384
6389
  // Release old video stream
6385
6390
  if (localStream) {
@@ -6447,7 +6452,7 @@ class WebRTCClient extends Emitter {
6447
6452
  const shouldDoScreenSharing = newConstraints && newConstraints.screen;
6448
6453
  const desktop = newConstraints && newConstraints.desktop;
6449
6454
 
6450
- logger$3.info('Sending reinvite', {
6455
+ logger.info('Sending reinvite', {
6451
6456
  id: this.getSipSessionId(sipSession),
6452
6457
  newConstraints,
6453
6458
  conference,
@@ -6485,7 +6490,7 @@ class WebRTCClient extends Emitter {
6485
6490
  sipSession.incomingInviteRequest.message.body = response.message.body;
6486
6491
  }
6487
6492
 
6488
- logger$3.info('on re-INVITE accepted', {
6493
+ logger.info('on re-INVITE accepted', {
6489
6494
  id: this.getSipSessionId(sipSession),
6490
6495
  wasMuted,
6491
6496
  shouldDoScreenSharing,
@@ -6660,7 +6665,7 @@ class WebRTCClient extends Emitter {
6660
6665
  }
6661
6666
 
6662
6667
  startHeartbeat() {
6663
- logger$3.info('sdk webrtc start heartbeat', { userAgent: !!this.userAgent });
6668
+ logger.info('sdk webrtc start heartbeat', { userAgent: !!this.userAgent });
6664
6669
  if (!this.userAgent) {
6665
6670
  this.heartbeat.stop();
6666
6671
  return;
@@ -6673,7 +6678,7 @@ class WebRTCClient extends Emitter {
6673
6678
  }
6674
6679
 
6675
6680
  stopHeartbeat() {
6676
- logger$3.info('sdk webrtc stop heartbeat');
6681
+ logger.info('sdk webrtc stop heartbeat');
6677
6682
  this.heartbeat.stop();
6678
6683
  }
6679
6684
 
@@ -6694,7 +6699,7 @@ class WebRTCClient extends Emitter {
6694
6699
  }
6695
6700
 
6696
6701
  attemptReconnection() {
6697
- logger$3.info('attempt reconnection', { userAgent: !!this.userAgent });
6702
+ logger.info('attempt reconnection', { userAgent: !!this.userAgent });
6698
6703
  if (!this.userAgent) {
6699
6704
  return;
6700
6705
  }
@@ -6719,7 +6724,7 @@ class WebRTCClient extends Emitter {
6719
6724
  return;
6720
6725
  }
6721
6726
 
6722
- logger$3.info('setting local media stream', {
6727
+ logger.info('setting local media stream', {
6723
6728
  sipSessionId,
6724
6729
  tracks: newStream ? newStream.getTracks() : null,
6725
6730
  });
@@ -6736,7 +6741,7 @@ class WebRTCClient extends Emitter {
6736
6741
 
6737
6742
  const oldStream = this.getLocalStream(sipSessionId);
6738
6743
 
6739
- logger$3.info('updating local stream', {
6744
+ logger.info('updating local stream', {
6740
6745
  sipSessionId,
6741
6746
  oldStream: !!oldStream,
6742
6747
  tracks: newStream.getTracks(),
@@ -6756,7 +6761,7 @@ class WebRTCClient extends Emitter {
6756
6761
  const remoteStream = this.getRemoteStream(sessionId);
6757
6762
  const pc = this.getPeerConnection(sessionId);
6758
6763
 
6759
- logger$3.info('Updating remote stream', {
6764
+ logger.info('Updating remote stream', {
6760
6765
  sessionId,
6761
6766
  tracks: remoteStream ? remoteStream.getTracks() : null,
6762
6767
  receiverTracks: pc && pc.getReceivers ? pc.getReceivers().map(receiver => receiver.track) : null,
@@ -6781,14 +6786,16 @@ class WebRTCClient extends Emitter {
6781
6786
  const screenSharing = constraints && 'screen' in constraints ? constraints.screen : false;
6782
6787
  const isDesktop = constraints && 'desktop' in constraints ? constraints.desktop : false;
6783
6788
  const withAudio = constraints && 'audio' in constraints ? constraints.audio : true;
6789
+ const mandatoryVideo = constraints && typeof constraints.video === 'object' ? constraints.video.mandatory : {};
6784
6790
 
6785
- logger$3.info('Retrieving media a configuration', { enableVideo, screenSharing, isDesktop, withAudio, constraints });
6791
+ logger.info('Retrieving media a configuration', { enableVideo, screenSharing, isDesktop, withAudio, constraints });
6786
6792
 
6787
6793
  return {
6788
6794
  constraints: {
6789
6795
  // Exact constraint are not supported with `getDisplayMedia` and we must have a video=false in desktop screenshare
6790
6796
  audio: screenSharing ? !isDesktop : (withAudio ? this._getAudioConstraints() : false),
6791
- video: screenSharing ? (isDesktop ? ({ mandatory: { chromeMediaSource: 'desktop' } }) : { cursor: 'always' })
6797
+ video: screenSharing ? (isDesktop
6798
+ ? ({ mandatory: { chromeMediaSource: 'desktop', ...(mandatoryVideo || {}) } }) : { cursor: 'always' })
6792
6799
  : this._getVideoConstraints(enableVideo),
6793
6800
  screen: screenSharing,
6794
6801
  desktop: isDesktop,
@@ -6831,7 +6838,7 @@ class WebRTCClient extends Emitter {
6831
6838
  }
6832
6839
 
6833
6840
  _onTransportError() {
6834
- logger$3.error('on transport error');
6841
+ logger.error('on transport error');
6835
6842
  this.eventEmitter.emit(TRANSPORT_ERROR);
6836
6843
  this.attemptReconnection();
6837
6844
  }
@@ -6840,7 +6847,7 @@ class WebRTCClient extends Emitter {
6840
6847
  const body = message && typeof message === 'object' ? message.data : message;
6841
6848
  if (body && body.indexOf('200 OK') !== -1) {
6842
6849
  if (this.hasHeartbeat()) {
6843
- logger$3.info('on heartbeat received from Asterisk', { hasHeartbeat: this.hasHeartbeat() });
6850
+ logger.info('on heartbeat received from Asterisk', { hasHeartbeat: this.hasHeartbeat() });
6844
6851
 
6845
6852
  this.heartbeat.onHeartbeat();
6846
6853
  if (this.heartbeatCb) {
@@ -6851,7 +6858,7 @@ class WebRTCClient extends Emitter {
6851
6858
  }
6852
6859
 
6853
6860
  async _onHeartbeatTimeout() {
6854
- logger$3.info('sdk webrtc heartbeat timed out', { userAgent: !!this.userAgent, cb: !!this.heartbeatTimeoutCb });
6861
+ logger.info('sdk webrtc heartbeat timed out', { userAgent: !!this.userAgent, cb: !!this.heartbeatTimeoutCb });
6855
6862
 
6856
6863
  if (this.heartbeatTimeoutCb) {
6857
6864
  this.heartbeatTimeoutCb();
@@ -6863,7 +6870,7 @@ class WebRTCClient extends Emitter {
6863
6870
  try {
6864
6871
  await this.userAgent.transport.disconnect();
6865
6872
  } catch (e) {
6866
- logger$3.error('Transport disconnection after heartbeat timeout, error', e);
6873
+ logger.error('Transport disconnection after heartbeat timeout, error', e);
6867
6874
  }
6868
6875
  }
6869
6876
 
@@ -6896,31 +6903,31 @@ class WebRTCClient extends Emitter {
6896
6903
  }
6897
6904
 
6898
6905
  _connectIfNeeded() {
6899
- logger$3.info('connect if needed, checking', { connected: this.isConnected() });
6906
+ logger.info('connect if needed, checking', { connected: this.isConnected() });
6900
6907
  if (!this.userAgent) {
6901
- logger$3.info('need to recreate User Agent');
6908
+ logger.info('need to recreate User Agent');
6902
6909
  this.userAgent = this.createUserAgent(this.uaConfigOverrides);
6903
6910
  }
6904
6911
 
6905
6912
  if (this.isConnected()) {
6906
- logger$3.info('webrtc sdk, already connected');
6913
+ logger.info('webrtc sdk, already connected');
6907
6914
  return Promise.resolve();
6908
6915
  }
6909
6916
 
6910
6917
  if (this.isConnecting()) {
6911
- logger$3.info('webrtc sdk, already connecting...');
6918
+ logger.info('webrtc sdk, already connecting...');
6912
6919
 
6913
6920
  this.connectionPromise = this.userAgent.transport.connectPromise;
6914
6921
  return this.connectionPromise;
6915
6922
  }
6916
6923
 
6917
6924
  if (this.connectionPromise) {
6918
- logger$3.info('webrtc sdk, connection promise connecting...');
6925
+ logger.info('webrtc sdk, connection promise connecting...');
6919
6926
  // $FlowFixMe
6920
6927
  return this.connectionPromise;
6921
6928
  }
6922
6929
 
6923
- logger$3.info('WebRTC UA needs to connect');
6930
+ logger.info('WebRTC UA needs to connect');
6924
6931
 
6925
6932
  // Force UA to reconnect
6926
6933
  if (this.userAgent && this.userAgent.state !== UserAgentState.Stopped) {
@@ -7045,7 +7052,7 @@ class WebRTCClient extends Emitter {
7045
7052
 
7046
7053
  sdh.peerConnectionDelegate = {
7047
7054
  onicecandidateerror: (error ) => {
7048
- logger$3.error('on icecandidate error', {
7055
+ logger.error('on icecandidate error', {
7049
7056
  address: error.address,
7050
7057
  port: error.port,
7051
7058
  errorCode: error.errorCode,
@@ -7074,7 +7081,7 @@ class WebRTCClient extends Emitter {
7074
7081
  updatedNumber = session.assertedIdentity.uri.normal.user;
7075
7082
  updatedCalleeName = session.assertedIdentity.displayName || updatedNumber;
7076
7083
  }
7077
- logger$3.info('re-invite received', { updatedCalleeName, updatedNumber, hadRemoteVideo });
7084
+ logger.info('re-invite received', { updatedCalleeName, updatedNumber, hadRemoteVideo });
7078
7085
 
7079
7086
  // Useful to know if it's a video upgrade or an unhold from a remote peer with a video stream
7080
7087
 
@@ -7095,7 +7102,7 @@ class WebRTCClient extends Emitter {
7095
7102
  }
7096
7103
 
7097
7104
  _onAccepted(session , sessionDialog , withEvent = true) {
7098
- logger$3.info('on call accepted', { id: session.id, remoteTag: session.remoteTag });
7105
+ logger.info('on call accepted', { id: session.id, remoteTag: session.remoteTag });
7099
7106
 
7100
7107
  this.storeSipSession(session);
7101
7108
 
@@ -7107,7 +7114,7 @@ class WebRTCClient extends Emitter {
7107
7114
  const onTrack = (event ) => {
7108
7115
  const isAudioOnly = this._isAudioOnly(session);
7109
7116
  const { kind, label, readyState, id, muted } = event.track;
7110
- logger$3.info('on track event', { isAudioOnly, kind, label, readyState, id, muted });
7117
+ logger.info('on track event', { isAudioOnly, kind, label, readyState, id, muted });
7111
7118
 
7112
7119
  // Stop video track in audio only mode
7113
7120
  if (isAudioOnly && kind === 'video') {
@@ -7123,12 +7130,14 @@ class WebRTCClient extends Emitter {
7123
7130
 
7124
7131
  session.sessionDescriptionHandler.remoteMediaStream.onaddtrack = onTrack;
7125
7132
 
7126
- pc.oniceconnectionstatechange = () => {
7127
- logger$3.info('on ice connection state changed', { state: pc.iceConnectionState });
7128
- if (pc.iceConnectionState === 'disconnected') {
7129
- this.eventEmitter.emit(ON_DISCONNECTED);
7130
- }
7131
- };
7133
+ if (pc) {
7134
+ pc.oniceconnectionstatechange = () => {
7135
+ logger.info('on ice connection state changed', { state: pc.iceConnectionState });
7136
+ if (pc.iceConnectionState === 'disconnected') {
7137
+ this.eventEmitter.emit(ON_DISCONNECTED);
7138
+ }
7139
+ };
7140
+ }
7132
7141
 
7133
7142
  if (withEvent) {
7134
7143
  this.eventEmitter.emit(ACCEPTED, session, sessionDialog);
@@ -7297,10 +7306,10 @@ class WebRTCClient extends Emitter {
7297
7306
 
7298
7307
  _stopSendingStats(session ) {
7299
7308
  const sessionId = this.getSipSessionId(session);
7300
- logger$3.trace('Check for stopping stats', { sessionId, ids: Object.keys(this.statsIntervals) });
7309
+ logger.trace('Check for stopping stats', { sessionId, ids: Object.keys(this.statsIntervals) });
7301
7310
 
7302
7311
  if (sessionId in this.statsIntervals) {
7303
- logger$3.trace('Stop sending stats for call', { sessionId });
7312
+ logger.trace('Stop sending stats for call', { sessionId });
7304
7313
  this.statsIntervals[sessionId]();
7305
7314
  delete this.statsIntervals[sessionId];
7306
7315
  }
@@ -7316,7 +7325,7 @@ class WebRTCClient extends Emitter {
7316
7325
  try {
7317
7326
  await this.userAgent.transport.disconnect();
7318
7327
  } catch (e) {
7319
- logger$3.error('WebRTC transport disconnect, error', e);
7328
+ logger.error('WebRTC transport disconnect, error', e);
7320
7329
  }
7321
7330
  }
7322
7331
  }
@@ -7338,13 +7347,17 @@ class WebRTCClient extends Emitter {
7338
7347
  const nbStats = this.sessionNetworkStats[sessionId].length;
7339
7348
  const lastNetworkStats = this.sessionNetworkStats[sessionId][nbStats - 1];
7340
7349
  const lastAudioSent = lastNetworkStats ? lastNetworkStats.audioBytesSent : 0;
7350
+ const lastAudioContentSent = lastNetworkStats ? lastNetworkStats.audioContentSent : 0;
7341
7351
  const lastVideoSent = lastNetworkStats ? lastNetworkStats.videoBytesSent : 0;
7342
7352
  const lastAudioReceived = lastNetworkStats ? lastNetworkStats.audioBytesReceived : 0;
7353
+ const lastAudioContentReceived = lastNetworkStats ? lastNetworkStats.audioContentReceived : 0;
7343
7354
  const lastVideoReceived = lastNetworkStats ? lastNetworkStats.videoBytesReceived : 0;
7344
7355
  const lastTransportSent = lastNetworkStats ? lastNetworkStats.transportSent : 0;
7345
7356
  const lastTransportReceived = lastNetworkStats ? lastNetworkStats.transportReceived : 0;
7346
- let audioBytesSent = 0;
7347
- let audioBytesReceived = 0;
7357
+ let audioBytesSent = 0; // content + header
7358
+ let audioBytesReceived = 0; // content + header
7359
+ let audioContentSent = 0; // useful to detect blank call
7360
+ let audioContentReceived = 0;
7348
7361
  let videoBytesSent = 0;
7349
7362
  let videoBytesReceived = 0;
7350
7363
  let transportSent = 0;
@@ -7354,6 +7367,7 @@ class WebRTCClient extends Emitter {
7354
7367
  stats.forEach(report => {
7355
7368
  if (report.type === 'outbound-rtp' && report.kind === 'audio') {
7356
7369
  audioBytesSent += Number(report.bytesSent) + Number(report.headerBytesSent);
7370
+ audioContentSent += Number(report.bytesSent);
7357
7371
  }
7358
7372
  if (report.type === 'remote-outbound-rtp' && report.kind === 'audio') {
7359
7373
  audioBytesSent += Number(report.bytesSent);
@@ -7365,6 +7379,7 @@ class WebRTCClient extends Emitter {
7365
7379
  packetsLost += Number(report.packetsLost);
7366
7380
  networkStats.packetsReceived = Number(report.packetsReceived);
7367
7381
  audioBytesReceived += Number(report.bytesReceived) + Number(report.headerBytesReceived);
7382
+ audioContentReceived += Number(report.bytesReceived);
7368
7383
  }
7369
7384
  if (report.type === 'inbound-rtp' && report.kind === 'video') {
7370
7385
  videoBytesReceived += Number(report.bytesReceived) + Number(report.headerBytesReceived);
@@ -7393,10 +7408,17 @@ class WebRTCClient extends Emitter {
7393
7408
  });
7394
7409
 
7395
7410
  networkStats.packetsLost = packetsLost;
7411
+
7396
7412
  networkStats.totalAudioBytesSent = audioBytesSent;
7397
7413
  networkStats.audioBytesSent = audioBytesSent - lastAudioSent;
7398
7414
  networkStats.totalAudioBytesReceived = audioBytesReceived - lastAudioReceived;
7399
7415
  networkStats.audioBytesReceived = audioBytesReceived;
7416
+
7417
+ networkStats.totalAudioContentSent = audioContentSent;
7418
+ networkStats.audioContentSent = audioContentSent - lastAudioContentSent;
7419
+ networkStats.totalAudioBytesReceived = audioContentReceived - lastAudioContentReceived;
7420
+ networkStats.audioContentReceived = audioContentReceived;
7421
+
7400
7422
  networkStats.totalVideoBytesSent = videoBytesSent;
7401
7423
  networkStats.videoBytesSent = videoBytesSent - lastVideoSent;
7402
7424
  networkStats.totalVideoBytesReceived = videoBytesReceived;