@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
@@ -5484,13 +5489,13 @@ class WebRTCClient extends Emitter {
5484
5489
 
5485
5490
  createUserAgent(configOverrides ) {
5486
5491
  const webRTCConfiguration = this._createWebRTCConfiguration(configOverrides);
5487
- logger$3.info('sdk webrtc, creating UA', { webRTCConfiguration });
5492
+ logger.info('sdk webrtc, creating UA', { webRTCConfiguration });
5488
5493
 
5489
5494
  webRTCConfiguration.delegate = {
5490
5495
  onConnect: this.onConnect.bind(this),
5491
5496
  onDisconnect: this.onDisconnect.bind(this),
5492
5497
  onInvite: (invitation ) => {
5493
- logger$3.info('sdk webrtc on invite', {
5498
+ logger.info('sdk webrtc on invite', {
5494
5499
  method: 'delegate.onInvite',
5495
5500
  id: invitation.id,
5496
5501
  remoteURI: invitation.remoteURI,
@@ -5533,7 +5538,7 @@ class WebRTCClient extends Emitter {
5533
5538
  }
5534
5539
 
5535
5540
  onConnect() {
5536
- logger$3.info('sdk webrtc connected', { method: 'delegate.onConnect' });
5541
+ logger.info('sdk webrtc connected', { method: 'delegate.onConnect' });
5537
5542
  this.eventEmitter.emit(CONNECTED);
5538
5543
  if (!this.isRegistered() && this.registerer && this.registerer.waiting) {
5539
5544
  this.registerer.waitingToggle(false);
@@ -5542,7 +5547,7 @@ class WebRTCClient extends Emitter {
5542
5547
  }
5543
5548
 
5544
5549
  async onDisconnect(error ) {
5545
- logger$3.info('sdk webrtc disconnected', { method: 'delegate.onConnect', error });
5550
+ logger.info('sdk webrtc disconnected', { method: 'delegate.onConnect', error });
5546
5551
  this.connectionPromise = null;
5547
5552
  // The UA will attempt to reconnect automatically when an error occurred
5548
5553
  this.eventEmitter.emit(DISCONNECTED, error);
@@ -5567,37 +5572,37 @@ class WebRTCClient extends Emitter {
5567
5572
  };
5568
5573
 
5569
5574
  if (this.skipRegister) {
5570
- logger$3.info('sdk webrtc skip register...', logInfo);
5575
+ logger.info('sdk webrtc skip register...', logInfo);
5571
5576
  return Promise.resolve();
5572
5577
  }
5573
5578
 
5574
- logger$3.info('sdk webrtc registering...', logInfo);
5579
+ logger.info('sdk webrtc registering...', logInfo);
5575
5580
 
5576
5581
  if (!this.userAgent) {
5577
- logger$3.info('sdk webrtc recreating User Agent');
5582
+ logger.info('sdk webrtc recreating User Agent');
5578
5583
  this.userAgent = this.createUserAgent(this.uaConfigOverrides);
5579
5584
  }
5580
5585
  if (!this.userAgent || this.isRegistered()) {
5581
- logger$3.info('sdk webrtc registering aborted, already registered or no UA can be created');
5586
+ logger.info('sdk webrtc registering aborted, already registered or no UA can be created');
5582
5587
  return Promise.resolve();
5583
5588
  }
5584
5589
 
5585
5590
  if (this.connectionPromise || (this.registerer && this.registerer.waiting)) {
5586
- logger$3.info('sdk webrtc registering aborted due to a registration in progress.');
5591
+ logger.info('sdk webrtc registering aborted due to a registration in progress.');
5587
5592
  return Promise.resolve();
5588
5593
  }
5589
5594
 
5590
5595
  const registerOptions = this._isWeb() ? {} : { extraContactHeaderParams: ['mobility=mobile'] };
5591
5596
 
5592
5597
  const onRegisterFailed = () => {
5593
- logger$3.info('sdk webrtc registering failed', { tries, registerer: !!this.registerer });
5598
+ logger.info('sdk webrtc registering failed', { tries, registerer: !!this.registerer });
5594
5599
  this.connectionPromise = null;
5595
5600
  if (this.registerer && this.registerer.waiting) {
5596
5601
  this.registerer.waitingToggle(false);
5597
5602
  }
5598
5603
 
5599
5604
  if (tries <= MAX_REGISTER_TRIES) {
5600
- logger$3.info('sdk webrtc registering, retrying...', { tries });
5605
+ logger.info('sdk webrtc registering, retrying...', { tries });
5601
5606
  setTimeout(() => this.register(tries + 1), 300);
5602
5607
  }
5603
5608
  };
@@ -5606,18 +5611,18 @@ class WebRTCClient extends Emitter {
5606
5611
  // Avoid race condition with the close method called just before register and setting userAgent to null
5607
5612
  // during the resolution of the primise.
5608
5613
  if (!this.userAgent) {
5609
- logger$3.info('sdk webrtc recreating User Agent after connection');
5614
+ logger.info('sdk webrtc recreating User Agent after connection');
5610
5615
  this.userAgent = this.createUserAgent(this.uaConfigOverrides);
5611
5616
  }
5612
5617
 
5613
- logger$3.info('sdk webrtc registering, transport connected', { registerOptions, ua: !!this.userAgent });
5618
+ logger.info('sdk webrtc registering, transport connected', { registerOptions, ua: !!this.userAgent });
5614
5619
  this.registerer = new Registerer(this.userAgent, registerOptions);
5615
5620
  this.connectionPromise = null;
5616
5621
  this._monkeyPatchRegisterer(this.registerer);
5617
5622
 
5618
5623
  // Bind registerer events
5619
5624
  this.registerer.stateChange.addListener(newState => {
5620
- logger$3.info('sdk webrtc registering, state changed', { newState });
5625
+ logger.info('sdk webrtc registering, state changed', { newState });
5621
5626
 
5622
5627
  if (newState === RegistererState.Registered && this.registerer
5623
5628
  && this.registerer.state === RegistererState.Registered) {
@@ -5630,7 +5635,7 @@ class WebRTCClient extends Emitter {
5630
5635
  const options = {
5631
5636
  requestDelegate: {
5632
5637
  onReject: response => {
5633
- logger$3.error('sdk webrtc registering, rejected', { response });
5638
+ logger.error('sdk webrtc registering, rejected', { response });
5634
5639
 
5635
5640
  onRegisterFailed();
5636
5641
  },
@@ -5638,13 +5643,13 @@ class WebRTCClient extends Emitter {
5638
5643
  };
5639
5644
 
5640
5645
  return this.registerer.register(options).catch((e) => {
5641
- logger$3.error('sdk webrtc registering, error', e);
5646
+ logger.error('sdk webrtc registering, error', e);
5642
5647
 
5643
5648
  this.eventEmitter.emit(REGISTRATION_FAILED);
5644
5649
  return e;
5645
5650
  });
5646
5651
  }).catch(error => {
5647
- logger$3.error('sdk webrtc registering, transport error', error);
5652
+ logger.error('sdk webrtc registering, transport error', error);
5648
5653
  onRegisterFailed();
5649
5654
  });
5650
5655
  }
@@ -5673,21 +5678,21 @@ class WebRTCClient extends Emitter {
5673
5678
  }
5674
5679
 
5675
5680
  unregister() {
5676
- logger$3.info('sdk webrtc unregistering..', { userAgent: !!this.userAgent, registerer: !!this.registerer });
5681
+ logger.info('sdk webrtc unregistering..', { userAgent: !!this.userAgent, registerer: !!this.registerer });
5677
5682
  if (!this.registerer) {
5678
5683
  return Promise.resolve();
5679
5684
  }
5680
5685
 
5681
5686
  try {
5682
5687
  return this.registerer.unregister().then(() => {
5683
- logger$3.info('sdk webrtc unregistered');
5688
+ logger.info('sdk webrtc unregistered');
5684
5689
  this._cleanupRegister();
5685
5690
  }).catch(e => {
5686
- logger$3.error('sdk webrtc unregistering, promise error', e);
5691
+ logger.error('sdk webrtc unregistering, promise error', e);
5687
5692
  this._cleanupRegister();
5688
5693
  });
5689
5694
  } catch (e) {
5690
- logger$3.error('sdk webrtc unregistering, error', e);
5695
+ logger.error('sdk webrtc unregistering, error', e);
5691
5696
  // Avoid issue with `undefined is not an object (evaluating 'new.target.prototype')` when triggering a new
5692
5697
  // error when the registerer is in a bad state
5693
5698
  this._cleanupRegister();
@@ -5695,7 +5700,7 @@ class WebRTCClient extends Emitter {
5695
5700
  }
5696
5701
 
5697
5702
  stop() {
5698
- logger$3.info('sdk webrtc stop', { userAgent: !!this.userAgent });
5703
+ logger.info('sdk webrtc stop', { userAgent: !!this.userAgent });
5699
5704
  if (!this.userAgent) {
5700
5705
  return Promise.resolve();
5701
5706
  }
@@ -5703,12 +5708,12 @@ class WebRTCClient extends Emitter {
5703
5708
  return this.userAgent.stop().then(() => {
5704
5709
  return this._cleanupRegister();
5705
5710
  }).catch(e => {
5706
- logger$3.warn('sdk webrtc stop, error', { message: e.message, stack: e.stack });
5711
+ logger.warn('sdk webrtc stop, error', { message: e.message, stack: e.stack });
5707
5712
  });
5708
5713
  }
5709
5714
 
5710
5715
  call(number , enableVideo , audioOnly = false, conference = false) {
5711
- logger$3.info('sdk webrtc creating call', { number, enableVideo, audioOnly });
5716
+ logger.info('sdk webrtc creating call', { number, enableVideo, audioOnly, conference });
5712
5717
  const inviterOptions = {
5713
5718
  sessionDescriptionHandlerOptionsReInvite: {
5714
5719
  conference,
@@ -5739,7 +5744,7 @@ class WebRTCClient extends Emitter {
5739
5744
  this._onAccepted(session, response.session, true);
5740
5745
  },
5741
5746
  onReject: (response ) => {
5742
- logger$3.info('on call rejected', { id: session.id, fromTag: session.fromTag });
5747
+ logger.info('on call rejected', { id: session.id, fromTag: session.fromTag });
5743
5748
  this._stopSendingStats(session);
5744
5749
  this.stopNetworkMonitoring(session);
5745
5750
 
@@ -5762,11 +5767,11 @@ class WebRTCClient extends Emitter {
5762
5767
  }
5763
5768
 
5764
5769
  answer(session , enableVideo ) {
5765
- logger$3.info('sdk webrtc answer call', { id: session.id, enableVideo });
5770
+ logger.info('sdk webrtc answer call', { id: session.id, enableVideo });
5766
5771
 
5767
5772
  if (!session || !session.accept) {
5768
5773
  const error = 'No session to answer, or not an invitation';
5769
- logger$3.warn(error);
5774
+ logger.warn(error);
5770
5775
  return Promise.reject(new Error(error));
5771
5776
  }
5772
5777
  const options = {
@@ -5776,15 +5781,15 @@ class WebRTCClient extends Emitter {
5776
5781
  return session.accept(options).then(() => {
5777
5782
  if (session.isCanceled) {
5778
5783
  const message = 'accepted a canceled session (or was canceled during the accept phase).';
5779
- logger$3.error(message, { id: session.id });
5784
+ logger.error(message, { id: session.id });
5780
5785
  this.onCallEnded(session);
5781
5786
 
5782
5787
  throw new CanceledCallError(message);
5783
5788
  }
5784
- logger$3.info('sdk webrtc answer, accepted.');
5789
+ logger.info('sdk webrtc answer, accepted.');
5785
5790
  this._onAccepted(session);
5786
5791
  }).catch(e => {
5787
- logger$3.error(`answer call error for ${session ? session.id : 'n/a'}`, e);
5792
+ logger.error(`answer call error for ${session ? session.id : 'n/a'}`, e);
5788
5793
 
5789
5794
  throw e;
5790
5795
  });
@@ -5792,7 +5797,7 @@ class WebRTCClient extends Emitter {
5792
5797
 
5793
5798
  hangup(session ) {
5794
5799
  const { state, id } = session;
5795
- logger$3.info('sdk webrtc hangup call', { id, state });
5800
+ logger.info('sdk webrtc hangup call', { id, state });
5796
5801
 
5797
5802
  try {
5798
5803
  this._stopSendingStats(session);
@@ -5821,7 +5826,7 @@ class WebRTCClient extends Emitter {
5821
5826
 
5822
5827
  return bye();
5823
5828
  } catch (error) {
5824
- logger$3.warn('sdk webrtc hangup, error', error);
5829
+ logger.warn('sdk webrtc hangup, error', error);
5825
5830
  }
5826
5831
 
5827
5832
  return null;
@@ -5839,7 +5844,7 @@ class WebRTCClient extends Emitter {
5839
5844
  // Fetch and emit an event at `interval` with session network stats
5840
5845
  startNetworkMonitoring(session , interval = 1000) {
5841
5846
  const sessionId = this.getSipSessionId(session);
5842
- logger$3.info('starting network inspection', { id: sessionId });
5847
+ logger.info('starting network inspection', { id: sessionId });
5843
5848
 
5844
5849
  this.sessionNetworkStats[sessionId] = [];
5845
5850
 
@@ -5849,7 +5854,7 @@ class WebRTCClient extends Emitter {
5849
5854
  stopNetworkMonitoring(session ) {
5850
5855
  const sessionId = this.getSipSessionId(session);
5851
5856
  const exists = sessionId in this.networkMonitoringInterval;
5852
- logger$3.info('stopping network inspection', { id: sessionId, exists });
5857
+ logger.info('stopping network inspection', { id: sessionId, exists });
5853
5858
 
5854
5859
  if (exists) {
5855
5860
  clearInterval(this.networkMonitoringInterval[sessionId]);
@@ -5859,17 +5864,17 @@ class WebRTCClient extends Emitter {
5859
5864
  }
5860
5865
 
5861
5866
  reject(session ) {
5862
- logger$3.info('sdk webrtc reject call', { id: session.id });
5867
+ logger.info('sdk webrtc reject call', { id: session.id });
5863
5868
 
5864
5869
  try {
5865
5870
  return session.reject ? session.reject() : session.cancel();
5866
5871
  } catch (e) {
5867
- logger$3.warn('Error when rejecting call', e.message, e.stack);
5872
+ logger.warn('Error when rejecting call', e.message, e.stack);
5868
5873
  }
5869
5874
  }
5870
5875
 
5871
5876
  async close() {
5872
- logger$3.info('sdk webrtc closing client', { userAgent: !!this.userAgent });
5877
+ logger.info('sdk webrtc closing client', { userAgent: !!this.userAgent });
5873
5878
  this._cleanupMedia();
5874
5879
  this.connectionPromise = null;
5875
5880
 
@@ -5900,7 +5905,7 @@ class WebRTCClient extends Emitter {
5900
5905
  // eg: "INVITE not rejectable in state Completed"
5901
5906
  }
5902
5907
  this.userAgent = null;
5903
- logger$3.info('sdk webrtc client closed');
5908
+ logger.info('sdk webrtc client closed');
5904
5909
  }
5905
5910
 
5906
5911
  getNumber(session ) {
@@ -5913,13 +5918,13 @@ class WebRTCClient extends Emitter {
5913
5918
  }
5914
5919
 
5915
5920
  mute(session ) {
5916
- logger$3.info('sdk webrtc mute', { id: session.id });
5921
+ logger.info('sdk webrtc mute', { id: session.id });
5917
5922
 
5918
5923
  this._toggleAudio(session, true);
5919
5924
  }
5920
5925
 
5921
5926
  unmute(session ) {
5922
- logger$3.info('sdk webrtc unmute', { id: session.id });
5927
+ logger.info('sdk webrtc unmute', { id: session.id });
5923
5928
 
5924
5929
  this._toggleAudio(session, false);
5925
5930
  }
@@ -5959,13 +5964,13 @@ class WebRTCClient extends Emitter {
5959
5964
  }
5960
5965
 
5961
5966
  toggleCameraOn(session ) {
5962
- logger$3.info('sdk webrtc toggle camera on', { id: session.id });
5967
+ logger.info('sdk webrtc toggle camera on', { id: session.id });
5963
5968
 
5964
5969
  this._toggleVideo(session, false);
5965
5970
  }
5966
5971
 
5967
5972
  toggleCameraOff(session ) {
5968
- logger$3.info('sdk webrtc toggle camera off', { id: session.id });
5973
+ logger.info('sdk webrtc toggle camera off', { id: session.id });
5969
5974
 
5970
5975
  this._toggleVideo(session, true);
5971
5976
  }
@@ -5974,7 +5979,7 @@ class WebRTCClient extends Emitter {
5974
5979
  const sessionId = this.getSipSessionId(session);
5975
5980
  const hasVideo = hadVideo || this.hasLocalVideo(sessionId);
5976
5981
 
5977
- logger$3.info('sdk webrtc hold', {
5982
+ logger.info('sdk webrtc hold', {
5978
5983
  sessionId,
5979
5984
  keys: Object.keys(this.heldSessions),
5980
5985
  pendingReinvite: !!session.pendingReinvite,
@@ -6023,7 +6028,7 @@ class WebRTCClient extends Emitter {
6023
6028
  const sessionId = this.getSipSessionId(session);
6024
6029
  const hasVideo = sessionId in this.heldSessions && this.heldSessions[sessionId].hasVideo;
6025
6030
 
6026
- logger$3.info('sdk webrtc unhold', {
6031
+ logger.info('sdk webrtc unhold', {
6027
6032
  sessionId,
6028
6033
  keys: Object.keys(this.heldSessions),
6029
6034
  pendingReinvite: !!session.pendingReinvite,
@@ -6171,7 +6176,7 @@ class WebRTCClient extends Emitter {
6171
6176
  if (!session.sessionDescriptionHandler) {
6172
6177
  return;
6173
6178
  }
6174
- logger$3.info('Sending DTMF', {
6179
+ logger.info('Sending DTMF', {
6175
6180
  id: this.getSipSessionId(session),
6176
6181
  tone,
6177
6182
  });
@@ -6187,7 +6192,7 @@ class WebRTCClient extends Emitter {
6187
6192
  transfer(session , target ) {
6188
6193
  this.hold(session);
6189
6194
 
6190
- logger$3.info('Transfering a session', {
6195
+ logger.info('Transfering a session', {
6191
6196
  id: this.getSipSessionId(session),
6192
6197
  target,
6193
6198
  });
@@ -6209,17 +6214,17 @@ class WebRTCClient extends Emitter {
6209
6214
  atxfer(session ) {
6210
6215
  this.hold(session);
6211
6216
 
6212
- logger$3.info('webrtc transfer started', { id: this.getSipSessionId(session) });
6217
+ logger.info('webrtc transfer started', { id: this.getSipSessionId(session) });
6213
6218
 
6214
6219
  const result = {
6215
6220
  newSession: null,
6216
6221
  init: async (target ) => {
6217
- logger$3.info('webrtc transfer initialized', { id: this.getSipSessionId(session), target });
6222
+ logger.info('webrtc transfer initialized', { id: this.getSipSessionId(session), target });
6218
6223
 
6219
6224
  result.newSession = await this.call(target);
6220
6225
  },
6221
6226
  complete: () => {
6222
- logger$3.info('webrtc transfer completed', {
6227
+ logger.info('webrtc transfer completed', {
6223
6228
  id: this.getSipSessionId(session),
6224
6229
  referId: this.getSipSessionId(result.newSession),
6225
6230
  });
@@ -6240,7 +6245,7 @@ class WebRTCClient extends Emitter {
6240
6245
  return;
6241
6246
  }
6242
6247
 
6243
- logger$3.info('send WebRTC message', { sipId: sipSession.id, contentType });
6248
+ logger.info('send WebRTC message', { sipId: sipSession.id, contentType });
6244
6249
 
6245
6250
  try {
6246
6251
  sipSession.message({
@@ -6282,7 +6287,7 @@ class WebRTCClient extends Emitter {
6282
6287
  }
6283
6288
 
6284
6289
  changeAudioOutputVolume(volume ) {
6285
- logger$3.info('Changing audio output volume', { volume });
6290
+ logger.info('Changing audio output volume', { volume });
6286
6291
 
6287
6292
  Object.values(this.audioElements).forEach(audioElement => {
6288
6293
  if (audioElement instanceof HTMLAudioElement) {
@@ -6294,7 +6299,7 @@ class WebRTCClient extends Emitter {
6294
6299
  }
6295
6300
 
6296
6301
  changeAudioOutputDevice(id ) {
6297
- logger$3.info('Changing audio output device', { id });
6302
+ logger.info('Changing audio output device', { id });
6298
6303
 
6299
6304
  Object.values(this.audioElements).forEach(audioElement => {
6300
6305
  // `setSinkId` method is not included in any flow type definitions for HTMLAudioElements but is a valid method
@@ -6311,7 +6316,7 @@ class WebRTCClient extends Emitter {
6311
6316
 
6312
6317
  changeAudioInputDevice(id , session ) {
6313
6318
  const currentId = this.getAudioDeviceId();
6314
- logger$3.info('setting audio input device', { id, currentId, session: !!session });
6319
+ logger.info('setting audio input device', { id, currentId, session: !!session });
6315
6320
 
6316
6321
  if (id === currentId) {
6317
6322
  return null;
@@ -6357,7 +6362,7 @@ class WebRTCClient extends Emitter {
6357
6362
 
6358
6363
  setVideoInputDevice(id ) {
6359
6364
  const currentId = this.getVideoDeviceId();
6360
- logger$3.info('setting video input device', { id, currentId });
6365
+ logger.info('setting video input device', { id, currentId });
6361
6366
 
6362
6367
  if (id === currentId) {
6363
6368
  return null;
@@ -6382,7 +6387,7 @@ class WebRTCClient extends Emitter {
6382
6387
  const sessionId = this.getSipSessionId(session);
6383
6388
  const localStream = this.getLocalStream(sessionId);
6384
6389
 
6385
- logger$3.info('changing video input device', { id, sessionId });
6390
+ logger.info('changing video input device', { id, sessionId });
6386
6391
 
6387
6392
  // Release old video stream
6388
6393
  if (localStream) {
@@ -6450,7 +6455,7 @@ class WebRTCClient extends Emitter {
6450
6455
  const shouldDoScreenSharing = newConstraints && newConstraints.screen;
6451
6456
  const desktop = newConstraints && newConstraints.desktop;
6452
6457
 
6453
- logger$3.info('Sending reinvite', {
6458
+ logger.info('Sending reinvite', {
6454
6459
  id: this.getSipSessionId(sipSession),
6455
6460
  newConstraints,
6456
6461
  conference,
@@ -6488,7 +6493,7 @@ class WebRTCClient extends Emitter {
6488
6493
  sipSession.incomingInviteRequest.message.body = response.message.body;
6489
6494
  }
6490
6495
 
6491
- logger$3.info('on re-INVITE accepted', {
6496
+ logger.info('on re-INVITE accepted', {
6492
6497
  id: this.getSipSessionId(sipSession),
6493
6498
  wasMuted,
6494
6499
  shouldDoScreenSharing,
@@ -6663,7 +6668,7 @@ class WebRTCClient extends Emitter {
6663
6668
  }
6664
6669
 
6665
6670
  startHeartbeat() {
6666
- logger$3.info('sdk webrtc start heartbeat', { userAgent: !!this.userAgent });
6671
+ logger.info('sdk webrtc start heartbeat', { userAgent: !!this.userAgent });
6667
6672
  if (!this.userAgent) {
6668
6673
  this.heartbeat.stop();
6669
6674
  return;
@@ -6676,7 +6681,7 @@ class WebRTCClient extends Emitter {
6676
6681
  }
6677
6682
 
6678
6683
  stopHeartbeat() {
6679
- logger$3.info('sdk webrtc stop heartbeat');
6684
+ logger.info('sdk webrtc stop heartbeat');
6680
6685
  this.heartbeat.stop();
6681
6686
  }
6682
6687
 
@@ -6697,7 +6702,7 @@ class WebRTCClient extends Emitter {
6697
6702
  }
6698
6703
 
6699
6704
  attemptReconnection() {
6700
- logger$3.info('attempt reconnection', { userAgent: !!this.userAgent });
6705
+ logger.info('attempt reconnection', { userAgent: !!this.userAgent });
6701
6706
  if (!this.userAgent) {
6702
6707
  return;
6703
6708
  }
@@ -6722,7 +6727,7 @@ class WebRTCClient extends Emitter {
6722
6727
  return;
6723
6728
  }
6724
6729
 
6725
- logger$3.info('setting local media stream', {
6730
+ logger.info('setting local media stream', {
6726
6731
  sipSessionId,
6727
6732
  tracks: newStream ? newStream.getTracks() : null,
6728
6733
  });
@@ -6739,7 +6744,7 @@ class WebRTCClient extends Emitter {
6739
6744
 
6740
6745
  const oldStream = this.getLocalStream(sipSessionId);
6741
6746
 
6742
- logger$3.info('updating local stream', {
6747
+ logger.info('updating local stream', {
6743
6748
  sipSessionId,
6744
6749
  oldStream: !!oldStream,
6745
6750
  tracks: newStream.getTracks(),
@@ -6759,7 +6764,7 @@ class WebRTCClient extends Emitter {
6759
6764
  const remoteStream = this.getRemoteStream(sessionId);
6760
6765
  const pc = this.getPeerConnection(sessionId);
6761
6766
 
6762
- logger$3.info('Updating remote stream', {
6767
+ logger.info('Updating remote stream', {
6763
6768
  sessionId,
6764
6769
  tracks: remoteStream ? remoteStream.getTracks() : null,
6765
6770
  receiverTracks: pc && pc.getReceivers ? pc.getReceivers().map(receiver => receiver.track) : null,
@@ -6784,14 +6789,16 @@ class WebRTCClient extends Emitter {
6784
6789
  const screenSharing = constraints && 'screen' in constraints ? constraints.screen : false;
6785
6790
  const isDesktop = constraints && 'desktop' in constraints ? constraints.desktop : false;
6786
6791
  const withAudio = constraints && 'audio' in constraints ? constraints.audio : true;
6792
+ const mandatoryVideo = constraints && typeof constraints.video === 'object' ? constraints.video.mandatory : {};
6787
6793
 
6788
- logger$3.info('Retrieving media a configuration', { enableVideo, screenSharing, isDesktop, withAudio, constraints });
6794
+ logger.info('Retrieving media a configuration', { enableVideo, screenSharing, isDesktop, withAudio, constraints });
6789
6795
 
6790
6796
  return {
6791
6797
  constraints: {
6792
6798
  // Exact constraint are not supported with `getDisplayMedia` and we must have a video=false in desktop screenshare
6793
6799
  audio: screenSharing ? !isDesktop : (withAudio ? this._getAudioConstraints() : false),
6794
- video: screenSharing ? (isDesktop ? ({ mandatory: { chromeMediaSource: 'desktop' } }) : { cursor: 'always' })
6800
+ video: screenSharing ? (isDesktop
6801
+ ? ({ mandatory: { chromeMediaSource: 'desktop', ...(mandatoryVideo || {}) } }) : { cursor: 'always' })
6795
6802
  : this._getVideoConstraints(enableVideo),
6796
6803
  screen: screenSharing,
6797
6804
  desktop: isDesktop,
@@ -6834,7 +6841,7 @@ class WebRTCClient extends Emitter {
6834
6841
  }
6835
6842
 
6836
6843
  _onTransportError() {
6837
- logger$3.error('on transport error');
6844
+ logger.error('on transport error');
6838
6845
  this.eventEmitter.emit(TRANSPORT_ERROR);
6839
6846
  this.attemptReconnection();
6840
6847
  }
@@ -6843,7 +6850,7 @@ class WebRTCClient extends Emitter {
6843
6850
  const body = message && typeof message === 'object' ? message.data : message;
6844
6851
  if (body && body.indexOf('200 OK') !== -1) {
6845
6852
  if (this.hasHeartbeat()) {
6846
- logger$3.info('on heartbeat received from Asterisk', { hasHeartbeat: this.hasHeartbeat() });
6853
+ logger.info('on heartbeat received from Asterisk', { hasHeartbeat: this.hasHeartbeat() });
6847
6854
 
6848
6855
  this.heartbeat.onHeartbeat();
6849
6856
  if (this.heartbeatCb) {
@@ -6854,7 +6861,7 @@ class WebRTCClient extends Emitter {
6854
6861
  }
6855
6862
 
6856
6863
  async _onHeartbeatTimeout() {
6857
- logger$3.info('sdk webrtc heartbeat timed out', { userAgent: !!this.userAgent, cb: !!this.heartbeatTimeoutCb });
6864
+ logger.info('sdk webrtc heartbeat timed out', { userAgent: !!this.userAgent, cb: !!this.heartbeatTimeoutCb });
6858
6865
 
6859
6866
  if (this.heartbeatTimeoutCb) {
6860
6867
  this.heartbeatTimeoutCb();
@@ -6866,7 +6873,7 @@ class WebRTCClient extends Emitter {
6866
6873
  try {
6867
6874
  await this.userAgent.transport.disconnect();
6868
6875
  } catch (e) {
6869
- logger$3.error('Transport disconnection after heartbeat timeout, error', e);
6876
+ logger.error('Transport disconnection after heartbeat timeout, error', e);
6870
6877
  }
6871
6878
  }
6872
6879
 
@@ -6899,31 +6906,31 @@ class WebRTCClient extends Emitter {
6899
6906
  }
6900
6907
 
6901
6908
  _connectIfNeeded() {
6902
- logger$3.info('connect if needed, checking', { connected: this.isConnected() });
6909
+ logger.info('connect if needed, checking', { connected: this.isConnected() });
6903
6910
  if (!this.userAgent) {
6904
- logger$3.info('need to recreate User Agent');
6911
+ logger.info('need to recreate User Agent');
6905
6912
  this.userAgent = this.createUserAgent(this.uaConfigOverrides);
6906
6913
  }
6907
6914
 
6908
6915
  if (this.isConnected()) {
6909
- logger$3.info('webrtc sdk, already connected');
6916
+ logger.info('webrtc sdk, already connected');
6910
6917
  return Promise.resolve();
6911
6918
  }
6912
6919
 
6913
6920
  if (this.isConnecting()) {
6914
- logger$3.info('webrtc sdk, already connecting...');
6921
+ logger.info('webrtc sdk, already connecting...');
6915
6922
 
6916
6923
  this.connectionPromise = this.userAgent.transport.connectPromise;
6917
6924
  return this.connectionPromise;
6918
6925
  }
6919
6926
 
6920
6927
  if (this.connectionPromise) {
6921
- logger$3.info('webrtc sdk, connection promise connecting...');
6928
+ logger.info('webrtc sdk, connection promise connecting...');
6922
6929
  // $FlowFixMe
6923
6930
  return this.connectionPromise;
6924
6931
  }
6925
6932
 
6926
- logger$3.info('WebRTC UA needs to connect');
6933
+ logger.info('WebRTC UA needs to connect');
6927
6934
 
6928
6935
  // Force UA to reconnect
6929
6936
  if (this.userAgent && this.userAgent.state !== UserAgentState.Stopped) {
@@ -7048,7 +7055,7 @@ class WebRTCClient extends Emitter {
7048
7055
 
7049
7056
  sdh.peerConnectionDelegate = {
7050
7057
  onicecandidateerror: (error ) => {
7051
- logger$3.error('on icecandidate error', {
7058
+ logger.error('on icecandidate error', {
7052
7059
  address: error.address,
7053
7060
  port: error.port,
7054
7061
  errorCode: error.errorCode,
@@ -7077,7 +7084,7 @@ class WebRTCClient extends Emitter {
7077
7084
  updatedNumber = session.assertedIdentity.uri.normal.user;
7078
7085
  updatedCalleeName = session.assertedIdentity.displayName || updatedNumber;
7079
7086
  }
7080
- logger$3.info('re-invite received', { updatedCalleeName, updatedNumber, hadRemoteVideo });
7087
+ logger.info('re-invite received', { updatedCalleeName, updatedNumber, hadRemoteVideo });
7081
7088
 
7082
7089
  // Useful to know if it's a video upgrade or an unhold from a remote peer with a video stream
7083
7090
 
@@ -7098,7 +7105,7 @@ class WebRTCClient extends Emitter {
7098
7105
  }
7099
7106
 
7100
7107
  _onAccepted(session , sessionDialog , withEvent = true) {
7101
- logger$3.info('on call accepted', { id: session.id, remoteTag: session.remoteTag });
7108
+ logger.info('on call accepted', { id: session.id, remoteTag: session.remoteTag });
7102
7109
 
7103
7110
  this.storeSipSession(session);
7104
7111
 
@@ -7110,7 +7117,7 @@ class WebRTCClient extends Emitter {
7110
7117
  const onTrack = (event ) => {
7111
7118
  const isAudioOnly = this._isAudioOnly(session);
7112
7119
  const { kind, label, readyState, id, muted } = event.track;
7113
- logger$3.info('on track event', { isAudioOnly, kind, label, readyState, id, muted });
7120
+ logger.info('on track event', { isAudioOnly, kind, label, readyState, id, muted });
7114
7121
 
7115
7122
  // Stop video track in audio only mode
7116
7123
  if (isAudioOnly && kind === 'video') {
@@ -7126,12 +7133,14 @@ class WebRTCClient extends Emitter {
7126
7133
 
7127
7134
  session.sessionDescriptionHandler.remoteMediaStream.onaddtrack = onTrack;
7128
7135
 
7129
- pc.oniceconnectionstatechange = () => {
7130
- logger$3.info('on ice connection state changed', { state: pc.iceConnectionState });
7131
- if (pc.iceConnectionState === 'disconnected') {
7132
- this.eventEmitter.emit(ON_DISCONNECTED);
7133
- }
7134
- };
7136
+ if (pc) {
7137
+ pc.oniceconnectionstatechange = () => {
7138
+ logger.info('on ice connection state changed', { state: pc.iceConnectionState });
7139
+ if (pc.iceConnectionState === 'disconnected') {
7140
+ this.eventEmitter.emit(ON_DISCONNECTED);
7141
+ }
7142
+ };
7143
+ }
7135
7144
 
7136
7145
  if (withEvent) {
7137
7146
  this.eventEmitter.emit(ACCEPTED, session, sessionDialog);
@@ -7300,10 +7309,10 @@ class WebRTCClient extends Emitter {
7300
7309
 
7301
7310
  _stopSendingStats(session ) {
7302
7311
  const sessionId = this.getSipSessionId(session);
7303
- logger$3.trace('Check for stopping stats', { sessionId, ids: Object.keys(this.statsIntervals) });
7312
+ logger.trace('Check for stopping stats', { sessionId, ids: Object.keys(this.statsIntervals) });
7304
7313
 
7305
7314
  if (sessionId in this.statsIntervals) {
7306
- logger$3.trace('Stop sending stats for call', { sessionId });
7315
+ logger.trace('Stop sending stats for call', { sessionId });
7307
7316
  this.statsIntervals[sessionId]();
7308
7317
  delete this.statsIntervals[sessionId];
7309
7318
  }
@@ -7319,7 +7328,7 @@ class WebRTCClient extends Emitter {
7319
7328
  try {
7320
7329
  await this.userAgent.transport.disconnect();
7321
7330
  } catch (e) {
7322
- logger$3.error('WebRTC transport disconnect, error', e);
7331
+ logger.error('WebRTC transport disconnect, error', e);
7323
7332
  }
7324
7333
  }
7325
7334
  }
@@ -7341,13 +7350,17 @@ class WebRTCClient extends Emitter {
7341
7350
  const nbStats = this.sessionNetworkStats[sessionId].length;
7342
7351
  const lastNetworkStats = this.sessionNetworkStats[sessionId][nbStats - 1];
7343
7352
  const lastAudioSent = lastNetworkStats ? lastNetworkStats.audioBytesSent : 0;
7353
+ const lastAudioContentSent = lastNetworkStats ? lastNetworkStats.audioContentSent : 0;
7344
7354
  const lastVideoSent = lastNetworkStats ? lastNetworkStats.videoBytesSent : 0;
7345
7355
  const lastAudioReceived = lastNetworkStats ? lastNetworkStats.audioBytesReceived : 0;
7356
+ const lastAudioContentReceived = lastNetworkStats ? lastNetworkStats.audioContentReceived : 0;
7346
7357
  const lastVideoReceived = lastNetworkStats ? lastNetworkStats.videoBytesReceived : 0;
7347
7358
  const lastTransportSent = lastNetworkStats ? lastNetworkStats.transportSent : 0;
7348
7359
  const lastTransportReceived = lastNetworkStats ? lastNetworkStats.transportReceived : 0;
7349
- let audioBytesSent = 0;
7350
- let audioBytesReceived = 0;
7360
+ let audioBytesSent = 0; // content + header
7361
+ let audioBytesReceived = 0; // content + header
7362
+ let audioContentSent = 0; // useful to detect blank call
7363
+ let audioContentReceived = 0;
7351
7364
  let videoBytesSent = 0;
7352
7365
  let videoBytesReceived = 0;
7353
7366
  let transportSent = 0;
@@ -7357,6 +7370,7 @@ class WebRTCClient extends Emitter {
7357
7370
  stats.forEach(report => {
7358
7371
  if (report.type === 'outbound-rtp' && report.kind === 'audio') {
7359
7372
  audioBytesSent += Number(report.bytesSent) + Number(report.headerBytesSent);
7373
+ audioContentSent += Number(report.bytesSent);
7360
7374
  }
7361
7375
  if (report.type === 'remote-outbound-rtp' && report.kind === 'audio') {
7362
7376
  audioBytesSent += Number(report.bytesSent);
@@ -7368,6 +7382,7 @@ class WebRTCClient extends Emitter {
7368
7382
  packetsLost += Number(report.packetsLost);
7369
7383
  networkStats.packetsReceived = Number(report.packetsReceived);
7370
7384
  audioBytesReceived += Number(report.bytesReceived) + Number(report.headerBytesReceived);
7385
+ audioContentReceived += Number(report.bytesReceived);
7371
7386
  }
7372
7387
  if (report.type === 'inbound-rtp' && report.kind === 'video') {
7373
7388
  videoBytesReceived += Number(report.bytesReceived) + Number(report.headerBytesReceived);
@@ -7396,10 +7411,17 @@ class WebRTCClient extends Emitter {
7396
7411
  });
7397
7412
 
7398
7413
  networkStats.packetsLost = packetsLost;
7414
+
7399
7415
  networkStats.totalAudioBytesSent = audioBytesSent;
7400
7416
  networkStats.audioBytesSent = audioBytesSent - lastAudioSent;
7401
7417
  networkStats.totalAudioBytesReceived = audioBytesReceived - lastAudioReceived;
7402
7418
  networkStats.audioBytesReceived = audioBytesReceived;
7419
+
7420
+ networkStats.totalAudioContentSent = audioContentSent;
7421
+ networkStats.audioContentSent = audioContentSent - lastAudioContentSent;
7422
+ networkStats.totalAudioBytesReceived = audioContentReceived - lastAudioContentReceived;
7423
+ networkStats.audioContentReceived = audioContentReceived;
7424
+
7403
7425
  networkStats.totalVideoBytesSent = videoBytesSent;
7404
7426
  networkStats.videoBytesSent = videoBytesSent - lastVideoSent;
7405
7427
  networkStats.totalVideoBytesReceived = videoBytesReceived;