@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
@@ -109,11 +109,11 @@ const isMobile = () => typeof navigator !== 'undefined' && navigator.product ===
109
109
 
110
110
  const methods = ['head', 'get', 'post', 'put', 'delete'];
111
111
 
112
- const logger = IssueReporter$1 ? IssueReporter$1.loggerFor('api') : console;
112
+ const logger$2 = IssueReporter$1 ? IssueReporter$1.loggerFor('api') : console;
113
113
 
114
114
  // Use a function here to be able to mock it in tests
115
115
  const realFetch = () => {
116
- if (typeof document !== 'undefined') {
116
+ if (typeof document !== 'undefined' && window.fetch) {
117
117
  // Browser
118
118
  return window.fetch;
119
119
  }
@@ -248,7 +248,7 @@ class ApiRequester {
248
248
  };
249
249
 
250
250
  if (this.refreshTokenPromise) {
251
- logger.info('A token is already refreshing, waiting ...', { url });
251
+ logger$2.info('A token is already refreshing, waiting ...', { url });
252
252
  await this.refreshTokenPromise;
253
253
  }
254
254
 
@@ -268,7 +268,7 @@ class ApiRequester {
268
268
  return promise.then(async (err ) => {
269
269
  // Check if the token is still valid
270
270
  if (firstCall && this._checkTokenExpired(response, err)) {
271
- logger.warn('token expired', { error: err.reason });
271
+ logger$2.warn('token expired', { error: err.reason });
272
272
  // Replay the call after refreshing the token
273
273
  return this._replayWithNewToken(err, path, method, body, headers, parse);
274
274
  }
@@ -278,7 +278,7 @@ class ApiRequester {
278
278
  : exceptionClass.fromResponse(err, response.status);
279
279
 
280
280
  if (this.shouldLogErrors) {
281
- logger.error('API error', error);
281
+ logger$2.error('API error', error);
282
282
  }
283
283
 
284
284
  throw error;
@@ -288,7 +288,7 @@ class ApiRequester {
288
288
  return newParse(response, isJson);
289
289
  }).catch(error => {
290
290
  if (this.shouldLogErrors) {
291
- logger.error('Fetch failed', { url, options, message: error.message, stack: error.stack });
291
+ logger$2.error('Fetch failed', { url, options, message: error.message, stack: error.stack });
292
292
  }
293
293
 
294
294
  throw error;
@@ -316,13 +316,13 @@ class ApiRequester {
316
316
  ) {
317
317
  const isTokenNotFound = this._isTokenNotFound(err);
318
318
  let newPath = path;
319
- logger.info('refreshing token', { inProgress: !!this.refreshTokenPromise });
319
+ logger$2.info('refreshing token', { inProgress: !!this.refreshTokenPromise });
320
320
 
321
321
  this.refreshTokenPromise = this.refreshTokenPromise || this.refreshTokenCallback();
322
322
 
323
323
  return this.refreshTokenPromise.then(() => {
324
324
  this.refreshTokenPromise = null;
325
- logger.info('token refreshed', { isTokenNotFound });
325
+ logger$2.info('token refreshed', { isTokenNotFound });
326
326
  if (isTokenNotFound) {
327
327
  const pathParts = path.split('/');
328
328
  pathParts.pop();
@@ -832,11 +832,16 @@ class WazoSessionDescriptionHandler extends sessionDescriptionHandler.SessionDes
832
832
 
833
833
  // $FlowFixMe
834
834
  setRemoteSessionDescription(sessionDescription ) {
835
- const result = super.setRemoteSessionDescription(sessionDescription);
835
+ try {
836
+ const result = super.setRemoteSessionDescription(sessionDescription);
836
837
 
837
- this.eventEmitter.emit('setDescription', sessionDescription);
838
+ this.eventEmitter.emit('setDescription', sessionDescription);
838
839
 
839
- return result;
840
+ return result;
841
+ } catch (error) {
842
+ this.logger.error('SessionDescriptionHandler.setRemoteSessionDescription error', error);
843
+ throw error;
844
+ }
840
845
  }
841
846
 
842
847
  // Overridden to avoid to fix ice-candidates missing in the SDP in react-native and chrome canary.
@@ -2456,7 +2461,7 @@ class Contact {
2456
2461
  this[key] = old[key] || this[key];
2457
2462
  });
2458
2463
 
2459
- if (old.lineState && !this.lineState) {
2464
+ if (old.lineState) {
2460
2465
  this.lineState = old.lineState;
2461
2466
  }
2462
2467
 
@@ -4147,7 +4152,7 @@ const TRANSFER_FLOW_BLIND = 'blind';
4147
4152
 
4148
4153
  // const MINIMUM_WAZO_ENGINE_VERSION_FOR_CTI_HOLD = '20.11';
4149
4154
 
4150
- const logger$1 = IssueReporter$1 ? IssueReporter$1.loggerFor('cti-phone') : console;
4155
+ IssueReporter$1 ? IssueReporter$1.loggerFor('cti-phone') : console;
4151
4156
 
4152
4157
  /* */
4153
4158
 
@@ -5066,7 +5071,7 @@ const AGENTD_VERSION = '1.0';
5066
5071
  const WEBHOOKD_VERSION = '1.0';
5067
5072
  const AMID_VERSION = '1.0';
5068
5073
 
5069
- const logger$2 = IssueReporter$1 ? IssueReporter$1.loggerFor('api') : console;
5074
+ const logger$1 = IssueReporter$1 ? IssueReporter$1.loggerFor('api') : console;
5070
5075
 
5071
5076
  class ApiClient {
5072
5077
 
@@ -5118,12 +5123,12 @@ class ApiClient {
5118
5123
  }
5119
5124
 
5120
5125
  async forceRefreshToken() {
5121
- logger$2.info('forcing refresh token, calling callback');
5126
+ logger$1.info('forcing refresh token, calling callback');
5122
5127
  return this.refreshTokenCallback();
5123
5128
  }
5124
5129
 
5125
5130
  async refreshTokenCallback() {
5126
- logger$2.info('refresh token callback called', {
5131
+ logger$1.info('refresh token callback called', {
5127
5132
  refreshToken: this.refreshToken,
5128
5133
  refreshBackend: this.refreshBackend,
5129
5134
  refreshExpiration: this.refreshExpiration,
@@ -5141,7 +5146,7 @@ class ApiClient {
5141
5146
  this.isMobile,
5142
5147
  );
5143
5148
 
5144
- logger$2.info('token refreshed', { token: session.token });
5149
+ logger$1.info('token refreshed', { token: session.token });
5145
5150
 
5146
5151
  if (this.onRefreshToken) {
5147
5152
  this.onRefreshToken(session.token, session);
@@ -5314,7 +5319,7 @@ const DEFAULT_ICE_TIMEOUT = 3000;
5314
5319
  const SEND_STATS_DELAY = 5000;
5315
5320
 
5316
5321
  const states = ['STATUS_NULL', 'STATUS_NEW', 'STATUS_CONNECTING', 'STATUS_CONNECTED', 'STATUS_COMPLETED'];
5317
- const logger$3 = IssueReporter$1 ? IssueReporter$1.loggerFor('webrtc-client') : console;
5322
+ const logger = IssueReporter$1 ? IssueReporter$1.loggerFor('webrtc-client') : console;
5318
5323
  const statsLogger = IssueReporter$1 ? IssueReporter$1.loggerFor('webrtc-stats') : console;
5319
5324
 
5320
5325
  // events
@@ -5490,13 +5495,13 @@ class WebRTCClient extends Emitter {
5490
5495
 
5491
5496
  createUserAgent(configOverrides ) {
5492
5497
  const webRTCConfiguration = this._createWebRTCConfiguration(configOverrides);
5493
- logger$3.info('sdk webrtc, creating UA', { webRTCConfiguration });
5498
+ logger.info('sdk webrtc, creating UA', { webRTCConfiguration });
5494
5499
 
5495
5500
  webRTCConfiguration.delegate = {
5496
5501
  onConnect: this.onConnect.bind(this),
5497
5502
  onDisconnect: this.onDisconnect.bind(this),
5498
5503
  onInvite: (invitation ) => {
5499
- logger$3.info('sdk webrtc on invite', {
5504
+ logger.info('sdk webrtc on invite', {
5500
5505
  method: 'delegate.onInvite',
5501
5506
  id: invitation.id,
5502
5507
  remoteURI: invitation.remoteURI,
@@ -5539,7 +5544,7 @@ class WebRTCClient extends Emitter {
5539
5544
  }
5540
5545
 
5541
5546
  onConnect() {
5542
- logger$3.info('sdk webrtc connected', { method: 'delegate.onConnect' });
5547
+ logger.info('sdk webrtc connected', { method: 'delegate.onConnect' });
5543
5548
  this.eventEmitter.emit(CONNECTED);
5544
5549
  if (!this.isRegistered() && this.registerer && this.registerer.waiting) {
5545
5550
  this.registerer.waitingToggle(false);
@@ -5548,7 +5553,7 @@ class WebRTCClient extends Emitter {
5548
5553
  }
5549
5554
 
5550
5555
  async onDisconnect(error ) {
5551
- logger$3.info('sdk webrtc disconnected', { method: 'delegate.onConnect', error });
5556
+ logger.info('sdk webrtc disconnected', { method: 'delegate.onConnect', error });
5552
5557
  this.connectionPromise = null;
5553
5558
  // The UA will attempt to reconnect automatically when an error occurred
5554
5559
  this.eventEmitter.emit(DISCONNECTED, error);
@@ -5573,37 +5578,37 @@ class WebRTCClient extends Emitter {
5573
5578
  };
5574
5579
 
5575
5580
  if (this.skipRegister) {
5576
- logger$3.info('sdk webrtc skip register...', logInfo);
5581
+ logger.info('sdk webrtc skip register...', logInfo);
5577
5582
  return Promise.resolve();
5578
5583
  }
5579
5584
 
5580
- logger$3.info('sdk webrtc registering...', logInfo);
5585
+ logger.info('sdk webrtc registering...', logInfo);
5581
5586
 
5582
5587
  if (!this.userAgent) {
5583
- logger$3.info('sdk webrtc recreating User Agent');
5588
+ logger.info('sdk webrtc recreating User Agent');
5584
5589
  this.userAgent = this.createUserAgent(this.uaConfigOverrides);
5585
5590
  }
5586
5591
  if (!this.userAgent || this.isRegistered()) {
5587
- logger$3.info('sdk webrtc registering aborted, already registered or no UA can be created');
5592
+ logger.info('sdk webrtc registering aborted, already registered or no UA can be created');
5588
5593
  return Promise.resolve();
5589
5594
  }
5590
5595
 
5591
5596
  if (this.connectionPromise || (this.registerer && this.registerer.waiting)) {
5592
- logger$3.info('sdk webrtc registering aborted due to a registration in progress.');
5597
+ logger.info('sdk webrtc registering aborted due to a registration in progress.');
5593
5598
  return Promise.resolve();
5594
5599
  }
5595
5600
 
5596
5601
  const registerOptions = this._isWeb() ? {} : { extraContactHeaderParams: ['mobility=mobile'] };
5597
5602
 
5598
5603
  const onRegisterFailed = () => {
5599
- logger$3.info('sdk webrtc registering failed', { tries, registerer: !!this.registerer });
5604
+ logger.info('sdk webrtc registering failed', { tries, registerer: !!this.registerer });
5600
5605
  this.connectionPromise = null;
5601
5606
  if (this.registerer && this.registerer.waiting) {
5602
5607
  this.registerer.waitingToggle(false);
5603
5608
  }
5604
5609
 
5605
5610
  if (tries <= MAX_REGISTER_TRIES) {
5606
- logger$3.info('sdk webrtc registering, retrying...', { tries });
5611
+ logger.info('sdk webrtc registering, retrying...', { tries });
5607
5612
  setTimeout(() => this.register(tries + 1), 300);
5608
5613
  }
5609
5614
  };
@@ -5612,18 +5617,18 @@ class WebRTCClient extends Emitter {
5612
5617
  // Avoid race condition with the close method called just before register and setting userAgent to null
5613
5618
  // during the resolution of the primise.
5614
5619
  if (!this.userAgent) {
5615
- logger$3.info('sdk webrtc recreating User Agent after connection');
5620
+ logger.info('sdk webrtc recreating User Agent after connection');
5616
5621
  this.userAgent = this.createUserAgent(this.uaConfigOverrides);
5617
5622
  }
5618
5623
 
5619
- logger$3.info('sdk webrtc registering, transport connected', { registerOptions, ua: !!this.userAgent });
5624
+ logger.info('sdk webrtc registering, transport connected', { registerOptions, ua: !!this.userAgent });
5620
5625
  this.registerer = new registerer.Registerer(this.userAgent, registerOptions);
5621
5626
  this.connectionPromise = null;
5622
5627
  this._monkeyPatchRegisterer(this.registerer);
5623
5628
 
5624
5629
  // Bind registerer events
5625
5630
  this.registerer.stateChange.addListener(newState => {
5626
- logger$3.info('sdk webrtc registering, state changed', { newState });
5631
+ logger.info('sdk webrtc registering, state changed', { newState });
5627
5632
 
5628
5633
  if (newState === registererState.RegistererState.Registered && this.registerer
5629
5634
  && this.registerer.state === registererState.RegistererState.Registered) {
@@ -5636,7 +5641,7 @@ class WebRTCClient extends Emitter {
5636
5641
  const options = {
5637
5642
  requestDelegate: {
5638
5643
  onReject: response => {
5639
- logger$3.error('sdk webrtc registering, rejected', { response });
5644
+ logger.error('sdk webrtc registering, rejected', { response });
5640
5645
 
5641
5646
  onRegisterFailed();
5642
5647
  },
@@ -5644,13 +5649,13 @@ class WebRTCClient extends Emitter {
5644
5649
  };
5645
5650
 
5646
5651
  return this.registerer.register(options).catch((e) => {
5647
- logger$3.error('sdk webrtc registering, error', e);
5652
+ logger.error('sdk webrtc registering, error', e);
5648
5653
 
5649
5654
  this.eventEmitter.emit(REGISTRATION_FAILED);
5650
5655
  return e;
5651
5656
  });
5652
5657
  }).catch(error => {
5653
- logger$3.error('sdk webrtc registering, transport error', error);
5658
+ logger.error('sdk webrtc registering, transport error', error);
5654
5659
  onRegisterFailed();
5655
5660
  });
5656
5661
  }
@@ -5679,21 +5684,21 @@ class WebRTCClient extends Emitter {
5679
5684
  }
5680
5685
 
5681
5686
  unregister() {
5682
- logger$3.info('sdk webrtc unregistering..', { userAgent: !!this.userAgent, registerer: !!this.registerer });
5687
+ logger.info('sdk webrtc unregistering..', { userAgent: !!this.userAgent, registerer: !!this.registerer });
5683
5688
  if (!this.registerer) {
5684
5689
  return Promise.resolve();
5685
5690
  }
5686
5691
 
5687
5692
  try {
5688
5693
  return this.registerer.unregister().then(() => {
5689
- logger$3.info('sdk webrtc unregistered');
5694
+ logger.info('sdk webrtc unregistered');
5690
5695
  this._cleanupRegister();
5691
5696
  }).catch(e => {
5692
- logger$3.error('sdk webrtc unregistering, promise error', e);
5697
+ logger.error('sdk webrtc unregistering, promise error', e);
5693
5698
  this._cleanupRegister();
5694
5699
  });
5695
5700
  } catch (e) {
5696
- logger$3.error('sdk webrtc unregistering, error', e);
5701
+ logger.error('sdk webrtc unregistering, error', e);
5697
5702
  // Avoid issue with `undefined is not an object (evaluating 'new.target.prototype')` when triggering a new
5698
5703
  // error when the registerer is in a bad state
5699
5704
  this._cleanupRegister();
@@ -5701,7 +5706,7 @@ class WebRTCClient extends Emitter {
5701
5706
  }
5702
5707
 
5703
5708
  stop() {
5704
- logger$3.info('sdk webrtc stop', { userAgent: !!this.userAgent });
5709
+ logger.info('sdk webrtc stop', { userAgent: !!this.userAgent });
5705
5710
  if (!this.userAgent) {
5706
5711
  return Promise.resolve();
5707
5712
  }
@@ -5709,12 +5714,12 @@ class WebRTCClient extends Emitter {
5709
5714
  return this.userAgent.stop().then(() => {
5710
5715
  return this._cleanupRegister();
5711
5716
  }).catch(e => {
5712
- logger$3.warn('sdk webrtc stop, error', { message: e.message, stack: e.stack });
5717
+ logger.warn('sdk webrtc stop, error', { message: e.message, stack: e.stack });
5713
5718
  });
5714
5719
  }
5715
5720
 
5716
5721
  call(number , enableVideo , audioOnly = false, conference = false) {
5717
- logger$3.info('sdk webrtc creating call', { number, enableVideo, audioOnly });
5722
+ logger.info('sdk webrtc creating call', { number, enableVideo, audioOnly, conference });
5718
5723
  const inviterOptions = {
5719
5724
  sessionDescriptionHandlerOptionsReInvite: {
5720
5725
  conference,
@@ -5745,7 +5750,7 @@ class WebRTCClient extends Emitter {
5745
5750
  this._onAccepted(session, response.session, true);
5746
5751
  },
5747
5752
  onReject: (response ) => {
5748
- logger$3.info('on call rejected', { id: session.id, fromTag: session.fromTag });
5753
+ logger.info('on call rejected', { id: session.id, fromTag: session.fromTag });
5749
5754
  this._stopSendingStats(session);
5750
5755
  this.stopNetworkMonitoring(session);
5751
5756
 
@@ -5768,11 +5773,11 @@ class WebRTCClient extends Emitter {
5768
5773
  }
5769
5774
 
5770
5775
  answer(session , enableVideo ) {
5771
- logger$3.info('sdk webrtc answer call', { id: session.id, enableVideo });
5776
+ logger.info('sdk webrtc answer call', { id: session.id, enableVideo });
5772
5777
 
5773
5778
  if (!session || !session.accept) {
5774
5779
  const error = 'No session to answer, or not an invitation';
5775
- logger$3.warn(error);
5780
+ logger.warn(error);
5776
5781
  return Promise.reject(new Error(error));
5777
5782
  }
5778
5783
  const options = {
@@ -5782,15 +5787,15 @@ class WebRTCClient extends Emitter {
5782
5787
  return session.accept(options).then(() => {
5783
5788
  if (session.isCanceled) {
5784
5789
  const message = 'accepted a canceled session (or was canceled during the accept phase).';
5785
- logger$3.error(message, { id: session.id });
5790
+ logger.error(message, { id: session.id });
5786
5791
  this.onCallEnded(session);
5787
5792
 
5788
5793
  throw new CanceledCallError(message);
5789
5794
  }
5790
- logger$3.info('sdk webrtc answer, accepted.');
5795
+ logger.info('sdk webrtc answer, accepted.');
5791
5796
  this._onAccepted(session);
5792
5797
  }).catch(e => {
5793
- logger$3.error(`answer call error for ${session ? session.id : 'n/a'}`, e);
5798
+ logger.error(`answer call error for ${session ? session.id : 'n/a'}`, e);
5794
5799
 
5795
5800
  throw e;
5796
5801
  });
@@ -5798,7 +5803,7 @@ class WebRTCClient extends Emitter {
5798
5803
 
5799
5804
  hangup(session ) {
5800
5805
  const { state, id } = session;
5801
- logger$3.info('sdk webrtc hangup call', { id, state });
5806
+ logger.info('sdk webrtc hangup call', { id, state });
5802
5807
 
5803
5808
  try {
5804
5809
  this._stopSendingStats(session);
@@ -5827,7 +5832,7 @@ class WebRTCClient extends Emitter {
5827
5832
 
5828
5833
  return bye();
5829
5834
  } catch (error) {
5830
- logger$3.warn('sdk webrtc hangup, error', error);
5835
+ logger.warn('sdk webrtc hangup, error', error);
5831
5836
  }
5832
5837
 
5833
5838
  return null;
@@ -5845,7 +5850,7 @@ class WebRTCClient extends Emitter {
5845
5850
  // Fetch and emit an event at `interval` with session network stats
5846
5851
  startNetworkMonitoring(session , interval = 1000) {
5847
5852
  const sessionId = this.getSipSessionId(session);
5848
- logger$3.info('starting network inspection', { id: sessionId });
5853
+ logger.info('starting network inspection', { id: sessionId });
5849
5854
 
5850
5855
  this.sessionNetworkStats[sessionId] = [];
5851
5856
 
@@ -5855,7 +5860,7 @@ class WebRTCClient extends Emitter {
5855
5860
  stopNetworkMonitoring(session ) {
5856
5861
  const sessionId = this.getSipSessionId(session);
5857
5862
  const exists = sessionId in this.networkMonitoringInterval;
5858
- logger$3.info('stopping network inspection', { id: sessionId, exists });
5863
+ logger.info('stopping network inspection', { id: sessionId, exists });
5859
5864
 
5860
5865
  if (exists) {
5861
5866
  clearInterval(this.networkMonitoringInterval[sessionId]);
@@ -5865,17 +5870,17 @@ class WebRTCClient extends Emitter {
5865
5870
  }
5866
5871
 
5867
5872
  reject(session ) {
5868
- logger$3.info('sdk webrtc reject call', { id: session.id });
5873
+ logger.info('sdk webrtc reject call', { id: session.id });
5869
5874
 
5870
5875
  try {
5871
5876
  return session.reject ? session.reject() : session.cancel();
5872
5877
  } catch (e) {
5873
- logger$3.warn('Error when rejecting call', e.message, e.stack);
5878
+ logger.warn('Error when rejecting call', e.message, e.stack);
5874
5879
  }
5875
5880
  }
5876
5881
 
5877
5882
  async close() {
5878
- logger$3.info('sdk webrtc closing client', { userAgent: !!this.userAgent });
5883
+ logger.info('sdk webrtc closing client', { userAgent: !!this.userAgent });
5879
5884
  this._cleanupMedia();
5880
5885
  this.connectionPromise = null;
5881
5886
 
@@ -5906,7 +5911,7 @@ class WebRTCClient extends Emitter {
5906
5911
  // eg: "INVITE not rejectable in state Completed"
5907
5912
  }
5908
5913
  this.userAgent = null;
5909
- logger$3.info('sdk webrtc client closed');
5914
+ logger.info('sdk webrtc client closed');
5910
5915
  }
5911
5916
 
5912
5917
  getNumber(session ) {
@@ -5919,13 +5924,13 @@ class WebRTCClient extends Emitter {
5919
5924
  }
5920
5925
 
5921
5926
  mute(session ) {
5922
- logger$3.info('sdk webrtc mute', { id: session.id });
5927
+ logger.info('sdk webrtc mute', { id: session.id });
5923
5928
 
5924
5929
  this._toggleAudio(session, true);
5925
5930
  }
5926
5931
 
5927
5932
  unmute(session ) {
5928
- logger$3.info('sdk webrtc unmute', { id: session.id });
5933
+ logger.info('sdk webrtc unmute', { id: session.id });
5929
5934
 
5930
5935
  this._toggleAudio(session, false);
5931
5936
  }
@@ -5965,13 +5970,13 @@ class WebRTCClient extends Emitter {
5965
5970
  }
5966
5971
 
5967
5972
  toggleCameraOn(session ) {
5968
- logger$3.info('sdk webrtc toggle camera on', { id: session.id });
5973
+ logger.info('sdk webrtc toggle camera on', { id: session.id });
5969
5974
 
5970
5975
  this._toggleVideo(session, false);
5971
5976
  }
5972
5977
 
5973
5978
  toggleCameraOff(session ) {
5974
- logger$3.info('sdk webrtc toggle camera off', { id: session.id });
5979
+ logger.info('sdk webrtc toggle camera off', { id: session.id });
5975
5980
 
5976
5981
  this._toggleVideo(session, true);
5977
5982
  }
@@ -5980,7 +5985,7 @@ class WebRTCClient extends Emitter {
5980
5985
  const sessionId = this.getSipSessionId(session);
5981
5986
  const hasVideo = hadVideo || this.hasLocalVideo(sessionId);
5982
5987
 
5983
- logger$3.info('sdk webrtc hold', {
5988
+ logger.info('sdk webrtc hold', {
5984
5989
  sessionId,
5985
5990
  keys: Object.keys(this.heldSessions),
5986
5991
  pendingReinvite: !!session.pendingReinvite,
@@ -6029,7 +6034,7 @@ class WebRTCClient extends Emitter {
6029
6034
  const sessionId = this.getSipSessionId(session);
6030
6035
  const hasVideo = sessionId in this.heldSessions && this.heldSessions[sessionId].hasVideo;
6031
6036
 
6032
- logger$3.info('sdk webrtc unhold', {
6037
+ logger.info('sdk webrtc unhold', {
6033
6038
  sessionId,
6034
6039
  keys: Object.keys(this.heldSessions),
6035
6040
  pendingReinvite: !!session.pendingReinvite,
@@ -6177,7 +6182,7 @@ class WebRTCClient extends Emitter {
6177
6182
  if (!session.sessionDescriptionHandler) {
6178
6183
  return;
6179
6184
  }
6180
- logger$3.info('Sending DTMF', {
6185
+ logger.info('Sending DTMF', {
6181
6186
  id: this.getSipSessionId(session),
6182
6187
  tone,
6183
6188
  });
@@ -6193,7 +6198,7 @@ class WebRTCClient extends Emitter {
6193
6198
  transfer(session , target ) {
6194
6199
  this.hold(session);
6195
6200
 
6196
- logger$3.info('Transfering a session', {
6201
+ logger.info('Transfering a session', {
6197
6202
  id: this.getSipSessionId(session),
6198
6203
  target,
6199
6204
  });
@@ -6215,17 +6220,17 @@ class WebRTCClient extends Emitter {
6215
6220
  atxfer(session ) {
6216
6221
  this.hold(session);
6217
6222
 
6218
- logger$3.info('webrtc transfer started', { id: this.getSipSessionId(session) });
6223
+ logger.info('webrtc transfer started', { id: this.getSipSessionId(session) });
6219
6224
 
6220
6225
  const result = {
6221
6226
  newSession: null,
6222
6227
  init: async (target ) => {
6223
- logger$3.info('webrtc transfer initialized', { id: this.getSipSessionId(session), target });
6228
+ logger.info('webrtc transfer initialized', { id: this.getSipSessionId(session), target });
6224
6229
 
6225
6230
  result.newSession = await this.call(target);
6226
6231
  },
6227
6232
  complete: () => {
6228
- logger$3.info('webrtc transfer completed', {
6233
+ logger.info('webrtc transfer completed', {
6229
6234
  id: this.getSipSessionId(session),
6230
6235
  referId: this.getSipSessionId(result.newSession),
6231
6236
  });
@@ -6246,7 +6251,7 @@ class WebRTCClient extends Emitter {
6246
6251
  return;
6247
6252
  }
6248
6253
 
6249
- logger$3.info('send WebRTC message', { sipId: sipSession.id, contentType });
6254
+ logger.info('send WebRTC message', { sipId: sipSession.id, contentType });
6250
6255
 
6251
6256
  try {
6252
6257
  sipSession.message({
@@ -6288,7 +6293,7 @@ class WebRTCClient extends Emitter {
6288
6293
  }
6289
6294
 
6290
6295
  changeAudioOutputVolume(volume ) {
6291
- logger$3.info('Changing audio output volume', { volume });
6296
+ logger.info('Changing audio output volume', { volume });
6292
6297
 
6293
6298
  Object.values(this.audioElements).forEach(audioElement => {
6294
6299
  if (audioElement instanceof HTMLAudioElement) {
@@ -6300,7 +6305,7 @@ class WebRTCClient extends Emitter {
6300
6305
  }
6301
6306
 
6302
6307
  changeAudioOutputDevice(id ) {
6303
- logger$3.info('Changing audio output device', { id });
6308
+ logger.info('Changing audio output device', { id });
6304
6309
 
6305
6310
  Object.values(this.audioElements).forEach(audioElement => {
6306
6311
  // `setSinkId` method is not included in any flow type definitions for HTMLAudioElements but is a valid method
@@ -6317,7 +6322,7 @@ class WebRTCClient extends Emitter {
6317
6322
 
6318
6323
  changeAudioInputDevice(id , session ) {
6319
6324
  const currentId = this.getAudioDeviceId();
6320
- logger$3.info('setting audio input device', { id, currentId, session: !!session });
6325
+ logger.info('setting audio input device', { id, currentId, session: !!session });
6321
6326
 
6322
6327
  if (id === currentId) {
6323
6328
  return null;
@@ -6363,7 +6368,7 @@ class WebRTCClient extends Emitter {
6363
6368
 
6364
6369
  setVideoInputDevice(id ) {
6365
6370
  const currentId = this.getVideoDeviceId();
6366
- logger$3.info('setting video input device', { id, currentId });
6371
+ logger.info('setting video input device', { id, currentId });
6367
6372
 
6368
6373
  if (id === currentId) {
6369
6374
  return null;
@@ -6388,7 +6393,7 @@ class WebRTCClient extends Emitter {
6388
6393
  const sessionId = this.getSipSessionId(session);
6389
6394
  const localStream = this.getLocalStream(sessionId);
6390
6395
 
6391
- logger$3.info('changing video input device', { id, sessionId });
6396
+ logger.info('changing video input device', { id, sessionId });
6392
6397
 
6393
6398
  // Release old video stream
6394
6399
  if (localStream) {
@@ -6456,7 +6461,7 @@ class WebRTCClient extends Emitter {
6456
6461
  const shouldDoScreenSharing = newConstraints && newConstraints.screen;
6457
6462
  const desktop = newConstraints && newConstraints.desktop;
6458
6463
 
6459
- logger$3.info('Sending reinvite', {
6464
+ logger.info('Sending reinvite', {
6460
6465
  id: this.getSipSessionId(sipSession),
6461
6466
  newConstraints,
6462
6467
  conference,
@@ -6494,7 +6499,7 @@ class WebRTCClient extends Emitter {
6494
6499
  sipSession.incomingInviteRequest.message.body = response.message.body;
6495
6500
  }
6496
6501
 
6497
- logger$3.info('on re-INVITE accepted', {
6502
+ logger.info('on re-INVITE accepted', {
6498
6503
  id: this.getSipSessionId(sipSession),
6499
6504
  wasMuted,
6500
6505
  shouldDoScreenSharing,
@@ -6669,7 +6674,7 @@ class WebRTCClient extends Emitter {
6669
6674
  }
6670
6675
 
6671
6676
  startHeartbeat() {
6672
- logger$3.info('sdk webrtc start heartbeat', { userAgent: !!this.userAgent });
6677
+ logger.info('sdk webrtc start heartbeat', { userAgent: !!this.userAgent });
6673
6678
  if (!this.userAgent) {
6674
6679
  this.heartbeat.stop();
6675
6680
  return;
@@ -6682,7 +6687,7 @@ class WebRTCClient extends Emitter {
6682
6687
  }
6683
6688
 
6684
6689
  stopHeartbeat() {
6685
- logger$3.info('sdk webrtc stop heartbeat');
6690
+ logger.info('sdk webrtc stop heartbeat');
6686
6691
  this.heartbeat.stop();
6687
6692
  }
6688
6693
 
@@ -6703,7 +6708,7 @@ class WebRTCClient extends Emitter {
6703
6708
  }
6704
6709
 
6705
6710
  attemptReconnection() {
6706
- logger$3.info('attempt reconnection', { userAgent: !!this.userAgent });
6711
+ logger.info('attempt reconnection', { userAgent: !!this.userAgent });
6707
6712
  if (!this.userAgent) {
6708
6713
  return;
6709
6714
  }
@@ -6728,7 +6733,7 @@ class WebRTCClient extends Emitter {
6728
6733
  return;
6729
6734
  }
6730
6735
 
6731
- logger$3.info('setting local media stream', {
6736
+ logger.info('setting local media stream', {
6732
6737
  sipSessionId,
6733
6738
  tracks: newStream ? newStream.getTracks() : null,
6734
6739
  });
@@ -6745,7 +6750,7 @@ class WebRTCClient extends Emitter {
6745
6750
 
6746
6751
  const oldStream = this.getLocalStream(sipSessionId);
6747
6752
 
6748
- logger$3.info('updating local stream', {
6753
+ logger.info('updating local stream', {
6749
6754
  sipSessionId,
6750
6755
  oldStream: !!oldStream,
6751
6756
  tracks: newStream.getTracks(),
@@ -6765,7 +6770,7 @@ class WebRTCClient extends Emitter {
6765
6770
  const remoteStream = this.getRemoteStream(sessionId);
6766
6771
  const pc = this.getPeerConnection(sessionId);
6767
6772
 
6768
- logger$3.info('Updating remote stream', {
6773
+ logger.info('Updating remote stream', {
6769
6774
  sessionId,
6770
6775
  tracks: remoteStream ? remoteStream.getTracks() : null,
6771
6776
  receiverTracks: pc && pc.getReceivers ? pc.getReceivers().map(receiver => receiver.track) : null,
@@ -6790,14 +6795,16 @@ class WebRTCClient extends Emitter {
6790
6795
  const screenSharing = constraints && 'screen' in constraints ? constraints.screen : false;
6791
6796
  const isDesktop = constraints && 'desktop' in constraints ? constraints.desktop : false;
6792
6797
  const withAudio = constraints && 'audio' in constraints ? constraints.audio : true;
6798
+ const mandatoryVideo = constraints && typeof constraints.video === 'object' ? constraints.video.mandatory : {};
6793
6799
 
6794
- logger$3.info('Retrieving media a configuration', { enableVideo, screenSharing, isDesktop, withAudio, constraints });
6800
+ logger.info('Retrieving media a configuration', { enableVideo, screenSharing, isDesktop, withAudio, constraints });
6795
6801
 
6796
6802
  return {
6797
6803
  constraints: {
6798
6804
  // Exact constraint are not supported with `getDisplayMedia` and we must have a video=false in desktop screenshare
6799
6805
  audio: screenSharing ? !isDesktop : (withAudio ? this._getAudioConstraints() : false),
6800
- video: screenSharing ? (isDesktop ? ({ mandatory: { chromeMediaSource: 'desktop' } }) : { cursor: 'always' })
6806
+ video: screenSharing ? (isDesktop
6807
+ ? ({ mandatory: { chromeMediaSource: 'desktop', ...(mandatoryVideo || {}) } }) : { cursor: 'always' })
6801
6808
  : this._getVideoConstraints(enableVideo),
6802
6809
  screen: screenSharing,
6803
6810
  desktop: isDesktop,
@@ -6840,7 +6847,7 @@ class WebRTCClient extends Emitter {
6840
6847
  }
6841
6848
 
6842
6849
  _onTransportError() {
6843
- logger$3.error('on transport error');
6850
+ logger.error('on transport error');
6844
6851
  this.eventEmitter.emit(TRANSPORT_ERROR);
6845
6852
  this.attemptReconnection();
6846
6853
  }
@@ -6849,7 +6856,7 @@ class WebRTCClient extends Emitter {
6849
6856
  const body = message && typeof message === 'object' ? message.data : message;
6850
6857
  if (body && body.indexOf('200 OK') !== -1) {
6851
6858
  if (this.hasHeartbeat()) {
6852
- logger$3.info('on heartbeat received from Asterisk', { hasHeartbeat: this.hasHeartbeat() });
6859
+ logger.info('on heartbeat received from Asterisk', { hasHeartbeat: this.hasHeartbeat() });
6853
6860
 
6854
6861
  this.heartbeat.onHeartbeat();
6855
6862
  if (this.heartbeatCb) {
@@ -6860,7 +6867,7 @@ class WebRTCClient extends Emitter {
6860
6867
  }
6861
6868
 
6862
6869
  async _onHeartbeatTimeout() {
6863
- logger$3.info('sdk webrtc heartbeat timed out', { userAgent: !!this.userAgent, cb: !!this.heartbeatTimeoutCb });
6870
+ logger.info('sdk webrtc heartbeat timed out', { userAgent: !!this.userAgent, cb: !!this.heartbeatTimeoutCb });
6864
6871
 
6865
6872
  if (this.heartbeatTimeoutCb) {
6866
6873
  this.heartbeatTimeoutCb();
@@ -6872,7 +6879,7 @@ class WebRTCClient extends Emitter {
6872
6879
  try {
6873
6880
  await this.userAgent.transport.disconnect();
6874
6881
  } catch (e) {
6875
- logger$3.error('Transport disconnection after heartbeat timeout, error', e);
6882
+ logger.error('Transport disconnection after heartbeat timeout, error', e);
6876
6883
  }
6877
6884
  }
6878
6885
 
@@ -6905,31 +6912,31 @@ class WebRTCClient extends Emitter {
6905
6912
  }
6906
6913
 
6907
6914
  _connectIfNeeded() {
6908
- logger$3.info('connect if needed, checking', { connected: this.isConnected() });
6915
+ logger.info('connect if needed, checking', { connected: this.isConnected() });
6909
6916
  if (!this.userAgent) {
6910
- logger$3.info('need to recreate User Agent');
6917
+ logger.info('need to recreate User Agent');
6911
6918
  this.userAgent = this.createUserAgent(this.uaConfigOverrides);
6912
6919
  }
6913
6920
 
6914
6921
  if (this.isConnected()) {
6915
- logger$3.info('webrtc sdk, already connected');
6922
+ logger.info('webrtc sdk, already connected');
6916
6923
  return Promise.resolve();
6917
6924
  }
6918
6925
 
6919
6926
  if (this.isConnecting()) {
6920
- logger$3.info('webrtc sdk, already connecting...');
6927
+ logger.info('webrtc sdk, already connecting...');
6921
6928
 
6922
6929
  this.connectionPromise = this.userAgent.transport.connectPromise;
6923
6930
  return this.connectionPromise;
6924
6931
  }
6925
6932
 
6926
6933
  if (this.connectionPromise) {
6927
- logger$3.info('webrtc sdk, connection promise connecting...');
6934
+ logger.info('webrtc sdk, connection promise connecting...');
6928
6935
  // $FlowFixMe
6929
6936
  return this.connectionPromise;
6930
6937
  }
6931
6938
 
6932
- logger$3.info('WebRTC UA needs to connect');
6939
+ logger.info('WebRTC UA needs to connect');
6933
6940
 
6934
6941
  // Force UA to reconnect
6935
6942
  if (this.userAgent && this.userAgent.state !== userAgentState.UserAgentState.Stopped) {
@@ -7054,7 +7061,7 @@ class WebRTCClient extends Emitter {
7054
7061
 
7055
7062
  sdh.peerConnectionDelegate = {
7056
7063
  onicecandidateerror: (error ) => {
7057
- logger$3.error('on icecandidate error', {
7064
+ logger.error('on icecandidate error', {
7058
7065
  address: error.address,
7059
7066
  port: error.port,
7060
7067
  errorCode: error.errorCode,
@@ -7083,7 +7090,7 @@ class WebRTCClient extends Emitter {
7083
7090
  updatedNumber = session.assertedIdentity.uri.normal.user;
7084
7091
  updatedCalleeName = session.assertedIdentity.displayName || updatedNumber;
7085
7092
  }
7086
- logger$3.info('re-invite received', { updatedCalleeName, updatedNumber, hadRemoteVideo });
7093
+ logger.info('re-invite received', { updatedCalleeName, updatedNumber, hadRemoteVideo });
7087
7094
 
7088
7095
  // Useful to know if it's a video upgrade or an unhold from a remote peer with a video stream
7089
7096
 
@@ -7104,7 +7111,7 @@ class WebRTCClient extends Emitter {
7104
7111
  }
7105
7112
 
7106
7113
  _onAccepted(session , sessionDialog , withEvent = true) {
7107
- logger$3.info('on call accepted', { id: session.id, remoteTag: session.remoteTag });
7114
+ logger.info('on call accepted', { id: session.id, remoteTag: session.remoteTag });
7108
7115
 
7109
7116
  this.storeSipSession(session);
7110
7117
 
@@ -7116,7 +7123,7 @@ class WebRTCClient extends Emitter {
7116
7123
  const onTrack = (event ) => {
7117
7124
  const isAudioOnly = this._isAudioOnly(session);
7118
7125
  const { kind, label, readyState, id, muted } = event.track;
7119
- logger$3.info('on track event', { isAudioOnly, kind, label, readyState, id, muted });
7126
+ logger.info('on track event', { isAudioOnly, kind, label, readyState, id, muted });
7120
7127
 
7121
7128
  // Stop video track in audio only mode
7122
7129
  if (isAudioOnly && kind === 'video') {
@@ -7132,12 +7139,14 @@ class WebRTCClient extends Emitter {
7132
7139
 
7133
7140
  session.sessionDescriptionHandler.remoteMediaStream.onaddtrack = onTrack;
7134
7141
 
7135
- pc.oniceconnectionstatechange = () => {
7136
- logger$3.info('on ice connection state changed', { state: pc.iceConnectionState });
7137
- if (pc.iceConnectionState === 'disconnected') {
7138
- this.eventEmitter.emit(ON_DISCONNECTED);
7139
- }
7140
- };
7142
+ if (pc) {
7143
+ pc.oniceconnectionstatechange = () => {
7144
+ logger.info('on ice connection state changed', { state: pc.iceConnectionState });
7145
+ if (pc.iceConnectionState === 'disconnected') {
7146
+ this.eventEmitter.emit(ON_DISCONNECTED);
7147
+ }
7148
+ };
7149
+ }
7141
7150
 
7142
7151
  if (withEvent) {
7143
7152
  this.eventEmitter.emit(ACCEPTED, session, sessionDialog);
@@ -7306,10 +7315,10 @@ class WebRTCClient extends Emitter {
7306
7315
 
7307
7316
  _stopSendingStats(session ) {
7308
7317
  const sessionId = this.getSipSessionId(session);
7309
- logger$3.trace('Check for stopping stats', { sessionId, ids: Object.keys(this.statsIntervals) });
7318
+ logger.trace('Check for stopping stats', { sessionId, ids: Object.keys(this.statsIntervals) });
7310
7319
 
7311
7320
  if (sessionId in this.statsIntervals) {
7312
- logger$3.trace('Stop sending stats for call', { sessionId });
7321
+ logger.trace('Stop sending stats for call', { sessionId });
7313
7322
  this.statsIntervals[sessionId]();
7314
7323
  delete this.statsIntervals[sessionId];
7315
7324
  }
@@ -7325,7 +7334,7 @@ class WebRTCClient extends Emitter {
7325
7334
  try {
7326
7335
  await this.userAgent.transport.disconnect();
7327
7336
  } catch (e) {
7328
- logger$3.error('WebRTC transport disconnect, error', e);
7337
+ logger.error('WebRTC transport disconnect, error', e);
7329
7338
  }
7330
7339
  }
7331
7340
  }
@@ -7347,13 +7356,17 @@ class WebRTCClient extends Emitter {
7347
7356
  const nbStats = this.sessionNetworkStats[sessionId].length;
7348
7357
  const lastNetworkStats = this.sessionNetworkStats[sessionId][nbStats - 1];
7349
7358
  const lastAudioSent = lastNetworkStats ? lastNetworkStats.audioBytesSent : 0;
7359
+ const lastAudioContentSent = lastNetworkStats ? lastNetworkStats.audioContentSent : 0;
7350
7360
  const lastVideoSent = lastNetworkStats ? lastNetworkStats.videoBytesSent : 0;
7351
7361
  const lastAudioReceived = lastNetworkStats ? lastNetworkStats.audioBytesReceived : 0;
7362
+ const lastAudioContentReceived = lastNetworkStats ? lastNetworkStats.audioContentReceived : 0;
7352
7363
  const lastVideoReceived = lastNetworkStats ? lastNetworkStats.videoBytesReceived : 0;
7353
7364
  const lastTransportSent = lastNetworkStats ? lastNetworkStats.transportSent : 0;
7354
7365
  const lastTransportReceived = lastNetworkStats ? lastNetworkStats.transportReceived : 0;
7355
- let audioBytesSent = 0;
7356
- let audioBytesReceived = 0;
7366
+ let audioBytesSent = 0; // content + header
7367
+ let audioBytesReceived = 0; // content + header
7368
+ let audioContentSent = 0; // useful to detect blank call
7369
+ let audioContentReceived = 0;
7357
7370
  let videoBytesSent = 0;
7358
7371
  let videoBytesReceived = 0;
7359
7372
  let transportSent = 0;
@@ -7363,6 +7376,7 @@ class WebRTCClient extends Emitter {
7363
7376
  stats.forEach(report => {
7364
7377
  if (report.type === 'outbound-rtp' && report.kind === 'audio') {
7365
7378
  audioBytesSent += Number(report.bytesSent) + Number(report.headerBytesSent);
7379
+ audioContentSent += Number(report.bytesSent);
7366
7380
  }
7367
7381
  if (report.type === 'remote-outbound-rtp' && report.kind === 'audio') {
7368
7382
  audioBytesSent += Number(report.bytesSent);
@@ -7374,6 +7388,7 @@ class WebRTCClient extends Emitter {
7374
7388
  packetsLost += Number(report.packetsLost);
7375
7389
  networkStats.packetsReceived = Number(report.packetsReceived);
7376
7390
  audioBytesReceived += Number(report.bytesReceived) + Number(report.headerBytesReceived);
7391
+ audioContentReceived += Number(report.bytesReceived);
7377
7392
  }
7378
7393
  if (report.type === 'inbound-rtp' && report.kind === 'video') {
7379
7394
  videoBytesReceived += Number(report.bytesReceived) + Number(report.headerBytesReceived);
@@ -7402,10 +7417,17 @@ class WebRTCClient extends Emitter {
7402
7417
  });
7403
7418
 
7404
7419
  networkStats.packetsLost = packetsLost;
7420
+
7405
7421
  networkStats.totalAudioBytesSent = audioBytesSent;
7406
7422
  networkStats.audioBytesSent = audioBytesSent - lastAudioSent;
7407
7423
  networkStats.totalAudioBytesReceived = audioBytesReceived - lastAudioReceived;
7408
7424
  networkStats.audioBytesReceived = audioBytesReceived;
7425
+
7426
+ networkStats.totalAudioContentSent = audioContentSent;
7427
+ networkStats.audioContentSent = audioContentSent - lastAudioContentSent;
7428
+ networkStats.totalAudioBytesReceived = audioContentReceived - lastAudioContentReceived;
7429
+ networkStats.audioContentReceived = audioContentReceived;
7430
+
7409
7431
  networkStats.totalVideoBytesSent = videoBytesSent;
7410
7432
  networkStats.videoBytesSent = videoBytesSent - lastVideoSent;
7411
7433
  networkStats.totalVideoBytesReceived = videoBytesReceived;