@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
@@ -111,11 +111,11 @@ const isMobile = () => typeof navigator !== 'undefined' && navigator.product ===
111
111
 
112
112
  const methods = ['head', 'get', 'post', 'put', 'delete'];
113
113
 
114
- const logger = IssueReporter$1 ? IssueReporter$1.loggerFor('api') : console;
114
+ const logger$2 = IssueReporter$1 ? IssueReporter$1.loggerFor('api') : console;
115
115
 
116
116
  // Use a function here to be able to mock it in tests
117
117
  const realFetch = () => {
118
- if (typeof document !== 'undefined') {
118
+ if (typeof document !== 'undefined' && window.fetch) {
119
119
  // Browser
120
120
  return window.fetch;
121
121
  }
@@ -250,7 +250,7 @@ class ApiRequester {
250
250
  };
251
251
 
252
252
  if (this.refreshTokenPromise) {
253
- logger.info('A token is already refreshing, waiting ...', { url });
253
+ logger$2.info('A token is already refreshing, waiting ...', { url });
254
254
  await this.refreshTokenPromise;
255
255
  }
256
256
 
@@ -270,7 +270,7 @@ class ApiRequester {
270
270
  return promise.then(async (err ) => {
271
271
  // Check if the token is still valid
272
272
  if (firstCall && this._checkTokenExpired(response, err)) {
273
- logger.warn('token expired', { error: err.reason });
273
+ logger$2.warn('token expired', { error: err.reason });
274
274
  // Replay the call after refreshing the token
275
275
  return this._replayWithNewToken(err, path, method, body, headers, parse);
276
276
  }
@@ -280,7 +280,7 @@ class ApiRequester {
280
280
  : exceptionClass.fromResponse(err, response.status);
281
281
 
282
282
  if (this.shouldLogErrors) {
283
- logger.error('API error', error);
283
+ logger$2.error('API error', error);
284
284
  }
285
285
 
286
286
  throw error;
@@ -290,7 +290,7 @@ class ApiRequester {
290
290
  return newParse(response, isJson);
291
291
  }).catch(error => {
292
292
  if (this.shouldLogErrors) {
293
- logger.error('Fetch failed', { url, options, message: error.message, stack: error.stack });
293
+ logger$2.error('Fetch failed', { url, options, message: error.message, stack: error.stack });
294
294
  }
295
295
 
296
296
  throw error;
@@ -318,13 +318,13 @@ class ApiRequester {
318
318
  ) {
319
319
  const isTokenNotFound = this._isTokenNotFound(err);
320
320
  let newPath = path;
321
- logger.info('refreshing token', { inProgress: !!this.refreshTokenPromise });
321
+ logger$2.info('refreshing token', { inProgress: !!this.refreshTokenPromise });
322
322
 
323
323
  this.refreshTokenPromise = this.refreshTokenPromise || this.refreshTokenCallback();
324
324
 
325
325
  return this.refreshTokenPromise.then(() => {
326
326
  this.refreshTokenPromise = null;
327
- logger.info('token refreshed', { isTokenNotFound });
327
+ logger$2.info('token refreshed', { isTokenNotFound });
328
328
  if (isTokenNotFound) {
329
329
  const pathParts = path.split('/');
330
330
  pathParts.pop();
@@ -834,11 +834,16 @@ class WazoSessionDescriptionHandler extends sessionDescriptionHandler.SessionDes
834
834
 
835
835
  // $FlowFixMe
836
836
  setRemoteSessionDescription(sessionDescription ) {
837
- const result = super.setRemoteSessionDescription(sessionDescription);
837
+ try {
838
+ const result = super.setRemoteSessionDescription(sessionDescription);
838
839
 
839
- this.eventEmitter.emit('setDescription', sessionDescription);
840
+ this.eventEmitter.emit('setDescription', sessionDescription);
840
841
 
841
- return result;
842
+ return result;
843
+ } catch (error) {
844
+ this.logger.error('SessionDescriptionHandler.setRemoteSessionDescription error', error);
845
+ throw error;
846
+ }
842
847
  }
843
848
 
844
849
  // Overridden to avoid to fix ice-candidates missing in the SDP in react-native and chrome canary.
@@ -2458,7 +2463,7 @@ class Contact {
2458
2463
  this[key] = old[key] || this[key];
2459
2464
  });
2460
2465
 
2461
- if (old.lineState && !this.lineState) {
2466
+ if (old.lineState) {
2462
2467
  this.lineState = old.lineState;
2463
2468
  }
2464
2469
 
@@ -4149,7 +4154,7 @@ const TRANSFER_FLOW_BLIND = 'blind';
4149
4154
 
4150
4155
  // const MINIMUM_WAZO_ENGINE_VERSION_FOR_CTI_HOLD = '20.11';
4151
4156
 
4152
- const logger$1 = IssueReporter$1 ? IssueReporter$1.loggerFor('cti-phone') : console;
4157
+ IssueReporter$1 ? IssueReporter$1.loggerFor('cti-phone') : console;
4153
4158
 
4154
4159
  /* */
4155
4160
 
@@ -5068,7 +5073,7 @@ const AGENTD_VERSION = '1.0';
5068
5073
  const WEBHOOKD_VERSION = '1.0';
5069
5074
  const AMID_VERSION = '1.0';
5070
5075
 
5071
- const logger$2 = IssueReporter$1 ? IssueReporter$1.loggerFor('api') : console;
5076
+ const logger$1 = IssueReporter$1 ? IssueReporter$1.loggerFor('api') : console;
5072
5077
 
5073
5078
  class ApiClient {
5074
5079
 
@@ -5120,12 +5125,12 @@ class ApiClient {
5120
5125
  }
5121
5126
 
5122
5127
  async forceRefreshToken() {
5123
- logger$2.info('forcing refresh token, calling callback');
5128
+ logger$1.info('forcing refresh token, calling callback');
5124
5129
  return this.refreshTokenCallback();
5125
5130
  }
5126
5131
 
5127
5132
  async refreshTokenCallback() {
5128
- logger$2.info('refresh token callback called', {
5133
+ logger$1.info('refresh token callback called', {
5129
5134
  refreshToken: this.refreshToken,
5130
5135
  refreshBackend: this.refreshBackend,
5131
5136
  refreshExpiration: this.refreshExpiration,
@@ -5143,7 +5148,7 @@ class ApiClient {
5143
5148
  this.isMobile,
5144
5149
  );
5145
5150
 
5146
- logger$2.info('token refreshed', { token: session.token });
5151
+ logger$1.info('token refreshed', { token: session.token });
5147
5152
 
5148
5153
  if (this.onRefreshToken) {
5149
5154
  this.onRefreshToken(session.token, session);
@@ -5316,7 +5321,7 @@ const DEFAULT_ICE_TIMEOUT = 3000;
5316
5321
  const SEND_STATS_DELAY = 5000;
5317
5322
 
5318
5323
  const states = ['STATUS_NULL', 'STATUS_NEW', 'STATUS_CONNECTING', 'STATUS_CONNECTED', 'STATUS_COMPLETED'];
5319
- const logger$3 = IssueReporter$1 ? IssueReporter$1.loggerFor('webrtc-client') : console;
5324
+ const logger = IssueReporter$1 ? IssueReporter$1.loggerFor('webrtc-client') : console;
5320
5325
  const statsLogger = IssueReporter$1 ? IssueReporter$1.loggerFor('webrtc-stats') : console;
5321
5326
 
5322
5327
  // events
@@ -5495,13 +5500,13 @@ class WebRTCClient extends Emitter {
5495
5500
 
5496
5501
  createUserAgent(configOverrides ) {
5497
5502
  const webRTCConfiguration = this._createWebRTCConfiguration(configOverrides);
5498
- logger$3.info('sdk webrtc, creating UA', { webRTCConfiguration });
5503
+ logger.info('sdk webrtc, creating UA', { webRTCConfiguration });
5499
5504
 
5500
5505
  webRTCConfiguration.delegate = {
5501
5506
  onConnect: this.onConnect.bind(this),
5502
5507
  onDisconnect: this.onDisconnect.bind(this),
5503
5508
  onInvite: (invitation ) => {
5504
- logger$3.info('sdk webrtc on invite', {
5509
+ logger.info('sdk webrtc on invite', {
5505
5510
  method: 'delegate.onInvite',
5506
5511
  id: invitation.id,
5507
5512
  remoteURI: invitation.remoteURI,
@@ -5544,7 +5549,7 @@ class WebRTCClient extends Emitter {
5544
5549
  }
5545
5550
 
5546
5551
  onConnect() {
5547
- logger$3.info('sdk webrtc connected', { method: 'delegate.onConnect' });
5552
+ logger.info('sdk webrtc connected', { method: 'delegate.onConnect' });
5548
5553
  this.eventEmitter.emit(CONNECTED);
5549
5554
  if (!this.isRegistered() && this.registerer && this.registerer.waiting) {
5550
5555
  this.registerer.waitingToggle(false);
@@ -5553,7 +5558,7 @@ class WebRTCClient extends Emitter {
5553
5558
  }
5554
5559
 
5555
5560
  async onDisconnect(error ) {
5556
- logger$3.info('sdk webrtc disconnected', { method: 'delegate.onConnect', error });
5561
+ logger.info('sdk webrtc disconnected', { method: 'delegate.onConnect', error });
5557
5562
  this.connectionPromise = null;
5558
5563
  // The UA will attempt to reconnect automatically when an error occurred
5559
5564
  this.eventEmitter.emit(DISCONNECTED, error);
@@ -5578,37 +5583,37 @@ class WebRTCClient extends Emitter {
5578
5583
  };
5579
5584
 
5580
5585
  if (this.skipRegister) {
5581
- logger$3.info('sdk webrtc skip register...', logInfo);
5586
+ logger.info('sdk webrtc skip register...', logInfo);
5582
5587
  return Promise.resolve();
5583
5588
  }
5584
5589
 
5585
- logger$3.info('sdk webrtc registering...', logInfo);
5590
+ logger.info('sdk webrtc registering...', logInfo);
5586
5591
 
5587
5592
  if (!this.userAgent) {
5588
- logger$3.info('sdk webrtc recreating User Agent');
5593
+ logger.info('sdk webrtc recreating User Agent');
5589
5594
  this.userAgent = this.createUserAgent(this.uaConfigOverrides);
5590
5595
  }
5591
5596
  if (!this.userAgent || this.isRegistered()) {
5592
- logger$3.info('sdk webrtc registering aborted, already registered or no UA can be created');
5597
+ logger.info('sdk webrtc registering aborted, already registered or no UA can be created');
5593
5598
  return Promise.resolve();
5594
5599
  }
5595
5600
 
5596
5601
  if (this.connectionPromise || (this.registerer && this.registerer.waiting)) {
5597
- logger$3.info('sdk webrtc registering aborted due to a registration in progress.');
5602
+ logger.info('sdk webrtc registering aborted due to a registration in progress.');
5598
5603
  return Promise.resolve();
5599
5604
  }
5600
5605
 
5601
5606
  const registerOptions = this._isWeb() ? {} : { extraContactHeaderParams: ['mobility=mobile'] };
5602
5607
 
5603
5608
  const onRegisterFailed = () => {
5604
- logger$3.info('sdk webrtc registering failed', { tries, registerer: !!this.registerer });
5609
+ logger.info('sdk webrtc registering failed', { tries, registerer: !!this.registerer });
5605
5610
  this.connectionPromise = null;
5606
5611
  if (this.registerer && this.registerer.waiting) {
5607
5612
  this.registerer.waitingToggle(false);
5608
5613
  }
5609
5614
 
5610
5615
  if (tries <= MAX_REGISTER_TRIES) {
5611
- logger$3.info('sdk webrtc registering, retrying...', { tries });
5616
+ logger.info('sdk webrtc registering, retrying...', { tries });
5612
5617
  setTimeout(() => this.register(tries + 1), 300);
5613
5618
  }
5614
5619
  };
@@ -5617,18 +5622,18 @@ class WebRTCClient extends Emitter {
5617
5622
  // Avoid race condition with the close method called just before register and setting userAgent to null
5618
5623
  // during the resolution of the primise.
5619
5624
  if (!this.userAgent) {
5620
- logger$3.info('sdk webrtc recreating User Agent after connection');
5625
+ logger.info('sdk webrtc recreating User Agent after connection');
5621
5626
  this.userAgent = this.createUserAgent(this.uaConfigOverrides);
5622
5627
  }
5623
5628
 
5624
- logger$3.info('sdk webrtc registering, transport connected', { registerOptions, ua: !!this.userAgent });
5629
+ logger.info('sdk webrtc registering, transport connected', { registerOptions, ua: !!this.userAgent });
5625
5630
  this.registerer = new registerer.Registerer(this.userAgent, registerOptions);
5626
5631
  this.connectionPromise = null;
5627
5632
  this._monkeyPatchRegisterer(this.registerer);
5628
5633
 
5629
5634
  // Bind registerer events
5630
5635
  this.registerer.stateChange.addListener(newState => {
5631
- logger$3.info('sdk webrtc registering, state changed', { newState });
5636
+ logger.info('sdk webrtc registering, state changed', { newState });
5632
5637
 
5633
5638
  if (newState === registererState.RegistererState.Registered && this.registerer
5634
5639
  && this.registerer.state === registererState.RegistererState.Registered) {
@@ -5641,7 +5646,7 @@ class WebRTCClient extends Emitter {
5641
5646
  const options = {
5642
5647
  requestDelegate: {
5643
5648
  onReject: response => {
5644
- logger$3.error('sdk webrtc registering, rejected', { response });
5649
+ logger.error('sdk webrtc registering, rejected', { response });
5645
5650
 
5646
5651
  onRegisterFailed();
5647
5652
  },
@@ -5649,13 +5654,13 @@ class WebRTCClient extends Emitter {
5649
5654
  };
5650
5655
 
5651
5656
  return this.registerer.register(options).catch((e) => {
5652
- logger$3.error('sdk webrtc registering, error', e);
5657
+ logger.error('sdk webrtc registering, error', e);
5653
5658
 
5654
5659
  this.eventEmitter.emit(REGISTRATION_FAILED);
5655
5660
  return e;
5656
5661
  });
5657
5662
  }).catch(error => {
5658
- logger$3.error('sdk webrtc registering, transport error', error);
5663
+ logger.error('sdk webrtc registering, transport error', error);
5659
5664
  onRegisterFailed();
5660
5665
  });
5661
5666
  }
@@ -5684,21 +5689,21 @@ class WebRTCClient extends Emitter {
5684
5689
  }
5685
5690
 
5686
5691
  unregister() {
5687
- logger$3.info('sdk webrtc unregistering..', { userAgent: !!this.userAgent, registerer: !!this.registerer });
5692
+ logger.info('sdk webrtc unregistering..', { userAgent: !!this.userAgent, registerer: !!this.registerer });
5688
5693
  if (!this.registerer) {
5689
5694
  return Promise.resolve();
5690
5695
  }
5691
5696
 
5692
5697
  try {
5693
5698
  return this.registerer.unregister().then(() => {
5694
- logger$3.info('sdk webrtc unregistered');
5699
+ logger.info('sdk webrtc unregistered');
5695
5700
  this._cleanupRegister();
5696
5701
  }).catch(e => {
5697
- logger$3.error('sdk webrtc unregistering, promise error', e);
5702
+ logger.error('sdk webrtc unregistering, promise error', e);
5698
5703
  this._cleanupRegister();
5699
5704
  });
5700
5705
  } catch (e) {
5701
- logger$3.error('sdk webrtc unregistering, error', e);
5706
+ logger.error('sdk webrtc unregistering, error', e);
5702
5707
  // Avoid issue with `undefined is not an object (evaluating 'new.target.prototype')` when triggering a new
5703
5708
  // error when the registerer is in a bad state
5704
5709
  this._cleanupRegister();
@@ -5706,7 +5711,7 @@ class WebRTCClient extends Emitter {
5706
5711
  }
5707
5712
 
5708
5713
  stop() {
5709
- logger$3.info('sdk webrtc stop', { userAgent: !!this.userAgent });
5714
+ logger.info('sdk webrtc stop', { userAgent: !!this.userAgent });
5710
5715
  if (!this.userAgent) {
5711
5716
  return Promise.resolve();
5712
5717
  }
@@ -5714,12 +5719,12 @@ class WebRTCClient extends Emitter {
5714
5719
  return this.userAgent.stop().then(() => {
5715
5720
  return this._cleanupRegister();
5716
5721
  }).catch(e => {
5717
- logger$3.warn('sdk webrtc stop, error', { message: e.message, stack: e.stack });
5722
+ logger.warn('sdk webrtc stop, error', { message: e.message, stack: e.stack });
5718
5723
  });
5719
5724
  }
5720
5725
 
5721
5726
  call(number , enableVideo , audioOnly = false, conference = false) {
5722
- logger$3.info('sdk webrtc creating call', { number, enableVideo, audioOnly });
5727
+ logger.info('sdk webrtc creating call', { number, enableVideo, audioOnly, conference });
5723
5728
  const inviterOptions = {
5724
5729
  sessionDescriptionHandlerOptionsReInvite: {
5725
5730
  conference,
@@ -5750,7 +5755,7 @@ class WebRTCClient extends Emitter {
5750
5755
  this._onAccepted(session, response.session, true);
5751
5756
  },
5752
5757
  onReject: (response ) => {
5753
- logger$3.info('on call rejected', { id: session.id, fromTag: session.fromTag });
5758
+ logger.info('on call rejected', { id: session.id, fromTag: session.fromTag });
5754
5759
  this._stopSendingStats(session);
5755
5760
  this.stopNetworkMonitoring(session);
5756
5761
 
@@ -5773,11 +5778,11 @@ class WebRTCClient extends Emitter {
5773
5778
  }
5774
5779
 
5775
5780
  answer(session , enableVideo ) {
5776
- logger$3.info('sdk webrtc answer call', { id: session.id, enableVideo });
5781
+ logger.info('sdk webrtc answer call', { id: session.id, enableVideo });
5777
5782
 
5778
5783
  if (!session || !session.accept) {
5779
5784
  const error = 'No session to answer, or not an invitation';
5780
- logger$3.warn(error);
5785
+ logger.warn(error);
5781
5786
  return Promise.reject(new Error(error));
5782
5787
  }
5783
5788
  const options = {
@@ -5787,15 +5792,15 @@ class WebRTCClient extends Emitter {
5787
5792
  return session.accept(options).then(() => {
5788
5793
  if (session.isCanceled) {
5789
5794
  const message = 'accepted a canceled session (or was canceled during the accept phase).';
5790
- logger$3.error(message, { id: session.id });
5795
+ logger.error(message, { id: session.id });
5791
5796
  this.onCallEnded(session);
5792
5797
 
5793
5798
  throw new CanceledCallError(message);
5794
5799
  }
5795
- logger$3.info('sdk webrtc answer, accepted.');
5800
+ logger.info('sdk webrtc answer, accepted.');
5796
5801
  this._onAccepted(session);
5797
5802
  }).catch(e => {
5798
- logger$3.error(`answer call error for ${session ? session.id : 'n/a'}`, e);
5803
+ logger.error(`answer call error for ${session ? session.id : 'n/a'}`, e);
5799
5804
 
5800
5805
  throw e;
5801
5806
  });
@@ -5803,7 +5808,7 @@ class WebRTCClient extends Emitter {
5803
5808
 
5804
5809
  hangup(session ) {
5805
5810
  const { state, id } = session;
5806
- logger$3.info('sdk webrtc hangup call', { id, state });
5811
+ logger.info('sdk webrtc hangup call', { id, state });
5807
5812
 
5808
5813
  try {
5809
5814
  this._stopSendingStats(session);
@@ -5832,7 +5837,7 @@ class WebRTCClient extends Emitter {
5832
5837
 
5833
5838
  return bye();
5834
5839
  } catch (error) {
5835
- logger$3.warn('sdk webrtc hangup, error', error);
5840
+ logger.warn('sdk webrtc hangup, error', error);
5836
5841
  }
5837
5842
 
5838
5843
  return null;
@@ -5850,7 +5855,7 @@ class WebRTCClient extends Emitter {
5850
5855
  // Fetch and emit an event at `interval` with session network stats
5851
5856
  startNetworkMonitoring(session , interval = 1000) {
5852
5857
  const sessionId = this.getSipSessionId(session);
5853
- logger$3.info('starting network inspection', { id: sessionId });
5858
+ logger.info('starting network inspection', { id: sessionId });
5854
5859
 
5855
5860
  this.sessionNetworkStats[sessionId] = [];
5856
5861
 
@@ -5860,7 +5865,7 @@ class WebRTCClient extends Emitter {
5860
5865
  stopNetworkMonitoring(session ) {
5861
5866
  const sessionId = this.getSipSessionId(session);
5862
5867
  const exists = sessionId in this.networkMonitoringInterval;
5863
- logger$3.info('stopping network inspection', { id: sessionId, exists });
5868
+ logger.info('stopping network inspection', { id: sessionId, exists });
5864
5869
 
5865
5870
  if (exists) {
5866
5871
  clearInterval(this.networkMonitoringInterval[sessionId]);
@@ -5870,17 +5875,17 @@ class WebRTCClient extends Emitter {
5870
5875
  }
5871
5876
 
5872
5877
  reject(session ) {
5873
- logger$3.info('sdk webrtc reject call', { id: session.id });
5878
+ logger.info('sdk webrtc reject call', { id: session.id });
5874
5879
 
5875
5880
  try {
5876
5881
  return session.reject ? session.reject() : session.cancel();
5877
5882
  } catch (e) {
5878
- logger$3.warn('Error when rejecting call', e.message, e.stack);
5883
+ logger.warn('Error when rejecting call', e.message, e.stack);
5879
5884
  }
5880
5885
  }
5881
5886
 
5882
5887
  async close() {
5883
- logger$3.info('sdk webrtc closing client', { userAgent: !!this.userAgent });
5888
+ logger.info('sdk webrtc closing client', { userAgent: !!this.userAgent });
5884
5889
  this._cleanupMedia();
5885
5890
  this.connectionPromise = null;
5886
5891
 
@@ -5911,7 +5916,7 @@ class WebRTCClient extends Emitter {
5911
5916
  // eg: "INVITE not rejectable in state Completed"
5912
5917
  }
5913
5918
  this.userAgent = null;
5914
- logger$3.info('sdk webrtc client closed');
5919
+ logger.info('sdk webrtc client closed');
5915
5920
  }
5916
5921
 
5917
5922
  getNumber(session ) {
@@ -5924,13 +5929,13 @@ class WebRTCClient extends Emitter {
5924
5929
  }
5925
5930
 
5926
5931
  mute(session ) {
5927
- logger$3.info('sdk webrtc mute', { id: session.id });
5932
+ logger.info('sdk webrtc mute', { id: session.id });
5928
5933
 
5929
5934
  this._toggleAudio(session, true);
5930
5935
  }
5931
5936
 
5932
5937
  unmute(session ) {
5933
- logger$3.info('sdk webrtc unmute', { id: session.id });
5938
+ logger.info('sdk webrtc unmute', { id: session.id });
5934
5939
 
5935
5940
  this._toggleAudio(session, false);
5936
5941
  }
@@ -5970,13 +5975,13 @@ class WebRTCClient extends Emitter {
5970
5975
  }
5971
5976
 
5972
5977
  toggleCameraOn(session ) {
5973
- logger$3.info('sdk webrtc toggle camera on', { id: session.id });
5978
+ logger.info('sdk webrtc toggle camera on', { id: session.id });
5974
5979
 
5975
5980
  this._toggleVideo(session, false);
5976
5981
  }
5977
5982
 
5978
5983
  toggleCameraOff(session ) {
5979
- logger$3.info('sdk webrtc toggle camera off', { id: session.id });
5984
+ logger.info('sdk webrtc toggle camera off', { id: session.id });
5980
5985
 
5981
5986
  this._toggleVideo(session, true);
5982
5987
  }
@@ -5985,7 +5990,7 @@ class WebRTCClient extends Emitter {
5985
5990
  const sessionId = this.getSipSessionId(session);
5986
5991
  const hasVideo = hadVideo || this.hasLocalVideo(sessionId);
5987
5992
 
5988
- logger$3.info('sdk webrtc hold', {
5993
+ logger.info('sdk webrtc hold', {
5989
5994
  sessionId,
5990
5995
  keys: Object.keys(this.heldSessions),
5991
5996
  pendingReinvite: !!session.pendingReinvite,
@@ -6034,7 +6039,7 @@ class WebRTCClient extends Emitter {
6034
6039
  const sessionId = this.getSipSessionId(session);
6035
6040
  const hasVideo = sessionId in this.heldSessions && this.heldSessions[sessionId].hasVideo;
6036
6041
 
6037
- logger$3.info('sdk webrtc unhold', {
6042
+ logger.info('sdk webrtc unhold', {
6038
6043
  sessionId,
6039
6044
  keys: Object.keys(this.heldSessions),
6040
6045
  pendingReinvite: !!session.pendingReinvite,
@@ -6182,7 +6187,7 @@ class WebRTCClient extends Emitter {
6182
6187
  if (!session.sessionDescriptionHandler) {
6183
6188
  return;
6184
6189
  }
6185
- logger$3.info('Sending DTMF', {
6190
+ logger.info('Sending DTMF', {
6186
6191
  id: this.getSipSessionId(session),
6187
6192
  tone,
6188
6193
  });
@@ -6198,7 +6203,7 @@ class WebRTCClient extends Emitter {
6198
6203
  transfer(session , target ) {
6199
6204
  this.hold(session);
6200
6205
 
6201
- logger$3.info('Transfering a session', {
6206
+ logger.info('Transfering a session', {
6202
6207
  id: this.getSipSessionId(session),
6203
6208
  target,
6204
6209
  });
@@ -6220,17 +6225,17 @@ class WebRTCClient extends Emitter {
6220
6225
  atxfer(session ) {
6221
6226
  this.hold(session);
6222
6227
 
6223
- logger$3.info('webrtc transfer started', { id: this.getSipSessionId(session) });
6228
+ logger.info('webrtc transfer started', { id: this.getSipSessionId(session) });
6224
6229
 
6225
6230
  const result = {
6226
6231
  newSession: null,
6227
6232
  init: async (target ) => {
6228
- logger$3.info('webrtc transfer initialized', { id: this.getSipSessionId(session), target });
6233
+ logger.info('webrtc transfer initialized', { id: this.getSipSessionId(session), target });
6229
6234
 
6230
6235
  result.newSession = await this.call(target);
6231
6236
  },
6232
6237
  complete: () => {
6233
- logger$3.info('webrtc transfer completed', {
6238
+ logger.info('webrtc transfer completed', {
6234
6239
  id: this.getSipSessionId(session),
6235
6240
  referId: this.getSipSessionId(result.newSession),
6236
6241
  });
@@ -6251,7 +6256,7 @@ class WebRTCClient extends Emitter {
6251
6256
  return;
6252
6257
  }
6253
6258
 
6254
- logger$3.info('send WebRTC message', { sipId: sipSession.id, contentType });
6259
+ logger.info('send WebRTC message', { sipId: sipSession.id, contentType });
6255
6260
 
6256
6261
  try {
6257
6262
  sipSession.message({
@@ -6293,7 +6298,7 @@ class WebRTCClient extends Emitter {
6293
6298
  }
6294
6299
 
6295
6300
  changeAudioOutputVolume(volume ) {
6296
- logger$3.info('Changing audio output volume', { volume });
6301
+ logger.info('Changing audio output volume', { volume });
6297
6302
 
6298
6303
  Object.values(this.audioElements).forEach(audioElement => {
6299
6304
  if (audioElement instanceof HTMLAudioElement) {
@@ -6305,7 +6310,7 @@ class WebRTCClient extends Emitter {
6305
6310
  }
6306
6311
 
6307
6312
  changeAudioOutputDevice(id ) {
6308
- logger$3.info('Changing audio output device', { id });
6313
+ logger.info('Changing audio output device', { id });
6309
6314
 
6310
6315
  Object.values(this.audioElements).forEach(audioElement => {
6311
6316
  // `setSinkId` method is not included in any flow type definitions for HTMLAudioElements but is a valid method
@@ -6322,7 +6327,7 @@ class WebRTCClient extends Emitter {
6322
6327
 
6323
6328
  changeAudioInputDevice(id , session ) {
6324
6329
  const currentId = this.getAudioDeviceId();
6325
- logger$3.info('setting audio input device', { id, currentId, session: !!session });
6330
+ logger.info('setting audio input device', { id, currentId, session: !!session });
6326
6331
 
6327
6332
  if (id === currentId) {
6328
6333
  return null;
@@ -6368,7 +6373,7 @@ class WebRTCClient extends Emitter {
6368
6373
 
6369
6374
  setVideoInputDevice(id ) {
6370
6375
  const currentId = this.getVideoDeviceId();
6371
- logger$3.info('setting video input device', { id, currentId });
6376
+ logger.info('setting video input device', { id, currentId });
6372
6377
 
6373
6378
  if (id === currentId) {
6374
6379
  return null;
@@ -6393,7 +6398,7 @@ class WebRTCClient extends Emitter {
6393
6398
  const sessionId = this.getSipSessionId(session);
6394
6399
  const localStream = this.getLocalStream(sessionId);
6395
6400
 
6396
- logger$3.info('changing video input device', { id, sessionId });
6401
+ logger.info('changing video input device', { id, sessionId });
6397
6402
 
6398
6403
  // Release old video stream
6399
6404
  if (localStream) {
@@ -6461,7 +6466,7 @@ class WebRTCClient extends Emitter {
6461
6466
  const shouldDoScreenSharing = newConstraints && newConstraints.screen;
6462
6467
  const desktop = newConstraints && newConstraints.desktop;
6463
6468
 
6464
- logger$3.info('Sending reinvite', {
6469
+ logger.info('Sending reinvite', {
6465
6470
  id: this.getSipSessionId(sipSession),
6466
6471
  newConstraints,
6467
6472
  conference,
@@ -6499,7 +6504,7 @@ class WebRTCClient extends Emitter {
6499
6504
  sipSession.incomingInviteRequest.message.body = response.message.body;
6500
6505
  }
6501
6506
 
6502
- logger$3.info('on re-INVITE accepted', {
6507
+ logger.info('on re-INVITE accepted', {
6503
6508
  id: this.getSipSessionId(sipSession),
6504
6509
  wasMuted,
6505
6510
  shouldDoScreenSharing,
@@ -6674,7 +6679,7 @@ class WebRTCClient extends Emitter {
6674
6679
  }
6675
6680
 
6676
6681
  startHeartbeat() {
6677
- logger$3.info('sdk webrtc start heartbeat', { userAgent: !!this.userAgent });
6682
+ logger.info('sdk webrtc start heartbeat', { userAgent: !!this.userAgent });
6678
6683
  if (!this.userAgent) {
6679
6684
  this.heartbeat.stop();
6680
6685
  return;
@@ -6687,7 +6692,7 @@ class WebRTCClient extends Emitter {
6687
6692
  }
6688
6693
 
6689
6694
  stopHeartbeat() {
6690
- logger$3.info('sdk webrtc stop heartbeat');
6695
+ logger.info('sdk webrtc stop heartbeat');
6691
6696
  this.heartbeat.stop();
6692
6697
  }
6693
6698
 
@@ -6708,7 +6713,7 @@ class WebRTCClient extends Emitter {
6708
6713
  }
6709
6714
 
6710
6715
  attemptReconnection() {
6711
- logger$3.info('attempt reconnection', { userAgent: !!this.userAgent });
6716
+ logger.info('attempt reconnection', { userAgent: !!this.userAgent });
6712
6717
  if (!this.userAgent) {
6713
6718
  return;
6714
6719
  }
@@ -6733,7 +6738,7 @@ class WebRTCClient extends Emitter {
6733
6738
  return;
6734
6739
  }
6735
6740
 
6736
- logger$3.info('setting local media stream', {
6741
+ logger.info('setting local media stream', {
6737
6742
  sipSessionId,
6738
6743
  tracks: newStream ? newStream.getTracks() : null,
6739
6744
  });
@@ -6750,7 +6755,7 @@ class WebRTCClient extends Emitter {
6750
6755
 
6751
6756
  const oldStream = this.getLocalStream(sipSessionId);
6752
6757
 
6753
- logger$3.info('updating local stream', {
6758
+ logger.info('updating local stream', {
6754
6759
  sipSessionId,
6755
6760
  oldStream: !!oldStream,
6756
6761
  tracks: newStream.getTracks(),
@@ -6770,7 +6775,7 @@ class WebRTCClient extends Emitter {
6770
6775
  const remoteStream = this.getRemoteStream(sessionId);
6771
6776
  const pc = this.getPeerConnection(sessionId);
6772
6777
 
6773
- logger$3.info('Updating remote stream', {
6778
+ logger.info('Updating remote stream', {
6774
6779
  sessionId,
6775
6780
  tracks: remoteStream ? remoteStream.getTracks() : null,
6776
6781
  receiverTracks: pc && pc.getReceivers ? pc.getReceivers().map(receiver => receiver.track) : null,
@@ -6795,14 +6800,16 @@ class WebRTCClient extends Emitter {
6795
6800
  const screenSharing = constraints && 'screen' in constraints ? constraints.screen : false;
6796
6801
  const isDesktop = constraints && 'desktop' in constraints ? constraints.desktop : false;
6797
6802
  const withAudio = constraints && 'audio' in constraints ? constraints.audio : true;
6803
+ const mandatoryVideo = constraints && typeof constraints.video === 'object' ? constraints.video.mandatory : {};
6798
6804
 
6799
- logger$3.info('Retrieving media a configuration', { enableVideo, screenSharing, isDesktop, withAudio, constraints });
6805
+ logger.info('Retrieving media a configuration', { enableVideo, screenSharing, isDesktop, withAudio, constraints });
6800
6806
 
6801
6807
  return {
6802
6808
  constraints: {
6803
6809
  // Exact constraint are not supported with `getDisplayMedia` and we must have a video=false in desktop screenshare
6804
6810
  audio: screenSharing ? !isDesktop : (withAudio ? this._getAudioConstraints() : false),
6805
- video: screenSharing ? (isDesktop ? ({ mandatory: { chromeMediaSource: 'desktop' } }) : { cursor: 'always' })
6811
+ video: screenSharing ? (isDesktop
6812
+ ? ({ mandatory: { chromeMediaSource: 'desktop', ...(mandatoryVideo || {}) } }) : { cursor: 'always' })
6806
6813
  : this._getVideoConstraints(enableVideo),
6807
6814
  screen: screenSharing,
6808
6815
  desktop: isDesktop,
@@ -6845,7 +6852,7 @@ class WebRTCClient extends Emitter {
6845
6852
  }
6846
6853
 
6847
6854
  _onTransportError() {
6848
- logger$3.error('on transport error');
6855
+ logger.error('on transport error');
6849
6856
  this.eventEmitter.emit(TRANSPORT_ERROR);
6850
6857
  this.attemptReconnection();
6851
6858
  }
@@ -6854,7 +6861,7 @@ class WebRTCClient extends Emitter {
6854
6861
  const body = message && typeof message === 'object' ? message.data : message;
6855
6862
  if (body && body.indexOf('200 OK') !== -1) {
6856
6863
  if (this.hasHeartbeat()) {
6857
- logger$3.info('on heartbeat received from Asterisk', { hasHeartbeat: this.hasHeartbeat() });
6864
+ logger.info('on heartbeat received from Asterisk', { hasHeartbeat: this.hasHeartbeat() });
6858
6865
 
6859
6866
  this.heartbeat.onHeartbeat();
6860
6867
  if (this.heartbeatCb) {
@@ -6865,7 +6872,7 @@ class WebRTCClient extends Emitter {
6865
6872
  }
6866
6873
 
6867
6874
  async _onHeartbeatTimeout() {
6868
- logger$3.info('sdk webrtc heartbeat timed out', { userAgent: !!this.userAgent, cb: !!this.heartbeatTimeoutCb });
6875
+ logger.info('sdk webrtc heartbeat timed out', { userAgent: !!this.userAgent, cb: !!this.heartbeatTimeoutCb });
6869
6876
 
6870
6877
  if (this.heartbeatTimeoutCb) {
6871
6878
  this.heartbeatTimeoutCb();
@@ -6877,7 +6884,7 @@ class WebRTCClient extends Emitter {
6877
6884
  try {
6878
6885
  await this.userAgent.transport.disconnect();
6879
6886
  } catch (e) {
6880
- logger$3.error('Transport disconnection after heartbeat timeout, error', e);
6887
+ logger.error('Transport disconnection after heartbeat timeout, error', e);
6881
6888
  }
6882
6889
  }
6883
6890
 
@@ -6910,31 +6917,31 @@ class WebRTCClient extends Emitter {
6910
6917
  }
6911
6918
 
6912
6919
  _connectIfNeeded() {
6913
- logger$3.info('connect if needed, checking', { connected: this.isConnected() });
6920
+ logger.info('connect if needed, checking', { connected: this.isConnected() });
6914
6921
  if (!this.userAgent) {
6915
- logger$3.info('need to recreate User Agent');
6922
+ logger.info('need to recreate User Agent');
6916
6923
  this.userAgent = this.createUserAgent(this.uaConfigOverrides);
6917
6924
  }
6918
6925
 
6919
6926
  if (this.isConnected()) {
6920
- logger$3.info('webrtc sdk, already connected');
6927
+ logger.info('webrtc sdk, already connected');
6921
6928
  return Promise.resolve();
6922
6929
  }
6923
6930
 
6924
6931
  if (this.isConnecting()) {
6925
- logger$3.info('webrtc sdk, already connecting...');
6932
+ logger.info('webrtc sdk, already connecting...');
6926
6933
 
6927
6934
  this.connectionPromise = this.userAgent.transport.connectPromise;
6928
6935
  return this.connectionPromise;
6929
6936
  }
6930
6937
 
6931
6938
  if (this.connectionPromise) {
6932
- logger$3.info('webrtc sdk, connection promise connecting...');
6939
+ logger.info('webrtc sdk, connection promise connecting...');
6933
6940
  // $FlowFixMe
6934
6941
  return this.connectionPromise;
6935
6942
  }
6936
6943
 
6937
- logger$3.info('WebRTC UA needs to connect');
6944
+ logger.info('WebRTC UA needs to connect');
6938
6945
 
6939
6946
  // Force UA to reconnect
6940
6947
  if (this.userAgent && this.userAgent.state !== userAgentState.UserAgentState.Stopped) {
@@ -7059,7 +7066,7 @@ class WebRTCClient extends Emitter {
7059
7066
 
7060
7067
  sdh.peerConnectionDelegate = {
7061
7068
  onicecandidateerror: (error ) => {
7062
- logger$3.error('on icecandidate error', {
7069
+ logger.error('on icecandidate error', {
7063
7070
  address: error.address,
7064
7071
  port: error.port,
7065
7072
  errorCode: error.errorCode,
@@ -7088,7 +7095,7 @@ class WebRTCClient extends Emitter {
7088
7095
  updatedNumber = session.assertedIdentity.uri.normal.user;
7089
7096
  updatedCalleeName = session.assertedIdentity.displayName || updatedNumber;
7090
7097
  }
7091
- logger$3.info('re-invite received', { updatedCalleeName, updatedNumber, hadRemoteVideo });
7098
+ logger.info('re-invite received', { updatedCalleeName, updatedNumber, hadRemoteVideo });
7092
7099
 
7093
7100
  // Useful to know if it's a video upgrade or an unhold from a remote peer with a video stream
7094
7101
 
@@ -7109,7 +7116,7 @@ class WebRTCClient extends Emitter {
7109
7116
  }
7110
7117
 
7111
7118
  _onAccepted(session , sessionDialog , withEvent = true) {
7112
- logger$3.info('on call accepted', { id: session.id, remoteTag: session.remoteTag });
7119
+ logger.info('on call accepted', { id: session.id, remoteTag: session.remoteTag });
7113
7120
 
7114
7121
  this.storeSipSession(session);
7115
7122
 
@@ -7121,7 +7128,7 @@ class WebRTCClient extends Emitter {
7121
7128
  const onTrack = (event ) => {
7122
7129
  const isAudioOnly = this._isAudioOnly(session);
7123
7130
  const { kind, label, readyState, id, muted } = event.track;
7124
- logger$3.info('on track event', { isAudioOnly, kind, label, readyState, id, muted });
7131
+ logger.info('on track event', { isAudioOnly, kind, label, readyState, id, muted });
7125
7132
 
7126
7133
  // Stop video track in audio only mode
7127
7134
  if (isAudioOnly && kind === 'video') {
@@ -7137,12 +7144,14 @@ class WebRTCClient extends Emitter {
7137
7144
 
7138
7145
  session.sessionDescriptionHandler.remoteMediaStream.onaddtrack = onTrack;
7139
7146
 
7140
- pc.oniceconnectionstatechange = () => {
7141
- logger$3.info('on ice connection state changed', { state: pc.iceConnectionState });
7142
- if (pc.iceConnectionState === 'disconnected') {
7143
- this.eventEmitter.emit(ON_DISCONNECTED);
7144
- }
7145
- };
7147
+ if (pc) {
7148
+ pc.oniceconnectionstatechange = () => {
7149
+ logger.info('on ice connection state changed', { state: pc.iceConnectionState });
7150
+ if (pc.iceConnectionState === 'disconnected') {
7151
+ this.eventEmitter.emit(ON_DISCONNECTED);
7152
+ }
7153
+ };
7154
+ }
7146
7155
 
7147
7156
  if (withEvent) {
7148
7157
  this.eventEmitter.emit(ACCEPTED, session, sessionDialog);
@@ -7311,10 +7320,10 @@ class WebRTCClient extends Emitter {
7311
7320
 
7312
7321
  _stopSendingStats(session ) {
7313
7322
  const sessionId = this.getSipSessionId(session);
7314
- logger$3.trace('Check for stopping stats', { sessionId, ids: Object.keys(this.statsIntervals) });
7323
+ logger.trace('Check for stopping stats', { sessionId, ids: Object.keys(this.statsIntervals) });
7315
7324
 
7316
7325
  if (sessionId in this.statsIntervals) {
7317
- logger$3.trace('Stop sending stats for call', { sessionId });
7326
+ logger.trace('Stop sending stats for call', { sessionId });
7318
7327
  this.statsIntervals[sessionId]();
7319
7328
  delete this.statsIntervals[sessionId];
7320
7329
  }
@@ -7330,7 +7339,7 @@ class WebRTCClient extends Emitter {
7330
7339
  try {
7331
7340
  await this.userAgent.transport.disconnect();
7332
7341
  } catch (e) {
7333
- logger$3.error('WebRTC transport disconnect, error', e);
7342
+ logger.error('WebRTC transport disconnect, error', e);
7334
7343
  }
7335
7344
  }
7336
7345
  }
@@ -7352,13 +7361,17 @@ class WebRTCClient extends Emitter {
7352
7361
  const nbStats = this.sessionNetworkStats[sessionId].length;
7353
7362
  const lastNetworkStats = this.sessionNetworkStats[sessionId][nbStats - 1];
7354
7363
  const lastAudioSent = lastNetworkStats ? lastNetworkStats.audioBytesSent : 0;
7364
+ const lastAudioContentSent = lastNetworkStats ? lastNetworkStats.audioContentSent : 0;
7355
7365
  const lastVideoSent = lastNetworkStats ? lastNetworkStats.videoBytesSent : 0;
7356
7366
  const lastAudioReceived = lastNetworkStats ? lastNetworkStats.audioBytesReceived : 0;
7367
+ const lastAudioContentReceived = lastNetworkStats ? lastNetworkStats.audioContentReceived : 0;
7357
7368
  const lastVideoReceived = lastNetworkStats ? lastNetworkStats.videoBytesReceived : 0;
7358
7369
  const lastTransportSent = lastNetworkStats ? lastNetworkStats.transportSent : 0;
7359
7370
  const lastTransportReceived = lastNetworkStats ? lastNetworkStats.transportReceived : 0;
7360
- let audioBytesSent = 0;
7361
- let audioBytesReceived = 0;
7371
+ let audioBytesSent = 0; // content + header
7372
+ let audioBytesReceived = 0; // content + header
7373
+ let audioContentSent = 0; // useful to detect blank call
7374
+ let audioContentReceived = 0;
7362
7375
  let videoBytesSent = 0;
7363
7376
  let videoBytesReceived = 0;
7364
7377
  let transportSent = 0;
@@ -7368,6 +7381,7 @@ class WebRTCClient extends Emitter {
7368
7381
  stats.forEach(report => {
7369
7382
  if (report.type === 'outbound-rtp' && report.kind === 'audio') {
7370
7383
  audioBytesSent += Number(report.bytesSent) + Number(report.headerBytesSent);
7384
+ audioContentSent += Number(report.bytesSent);
7371
7385
  }
7372
7386
  if (report.type === 'remote-outbound-rtp' && report.kind === 'audio') {
7373
7387
  audioBytesSent += Number(report.bytesSent);
@@ -7379,6 +7393,7 @@ class WebRTCClient extends Emitter {
7379
7393
  packetsLost += Number(report.packetsLost);
7380
7394
  networkStats.packetsReceived = Number(report.packetsReceived);
7381
7395
  audioBytesReceived += Number(report.bytesReceived) + Number(report.headerBytesReceived);
7396
+ audioContentReceived += Number(report.bytesReceived);
7382
7397
  }
7383
7398
  if (report.type === 'inbound-rtp' && report.kind === 'video') {
7384
7399
  videoBytesReceived += Number(report.bytesReceived) + Number(report.headerBytesReceived);
@@ -7407,10 +7422,17 @@ class WebRTCClient extends Emitter {
7407
7422
  });
7408
7423
 
7409
7424
  networkStats.packetsLost = packetsLost;
7425
+
7410
7426
  networkStats.totalAudioBytesSent = audioBytesSent;
7411
7427
  networkStats.audioBytesSent = audioBytesSent - lastAudioSent;
7412
7428
  networkStats.totalAudioBytesReceived = audioBytesReceived - lastAudioReceived;
7413
7429
  networkStats.audioBytesReceived = audioBytesReceived;
7430
+
7431
+ networkStats.totalAudioContentSent = audioContentSent;
7432
+ networkStats.audioContentSent = audioContentSent - lastAudioContentSent;
7433
+ networkStats.totalAudioBytesReceived = audioContentReceived - lastAudioContentReceived;
7434
+ networkStats.audioContentReceived = audioContentReceived;
7435
+
7414
7436
  networkStats.totalVideoBytesSent = videoBytesSent;
7415
7437
  networkStats.videoBytesSent = videoBytesSent - lastVideoSent;
7416
7438
  networkStats.totalVideoBytesReceived = videoBytesReceived;