@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
@@ -468,11 +468,11 @@ var IssueReporter$1 = new IssueReporter();
468
468
 
469
469
  const methods = ['head', 'get', 'post', 'put', 'delete'];
470
470
 
471
- const logger = IssueReporter$1 ? IssueReporter$1.loggerFor('api') : console;
471
+ const logger$3 = IssueReporter$1 ? IssueReporter$1.loggerFor('api') : console;
472
472
 
473
473
  // Use a function here to be able to mock it in tests
474
474
  const realFetch = () => {
475
- if (typeof document !== 'undefined') {
475
+ if (typeof document !== 'undefined' && window.fetch) {
476
476
  // Browser
477
477
  return window.fetch;
478
478
  }
@@ -607,7 +607,7 @@ class ApiRequester {
607
607
  };
608
608
 
609
609
  if (this.refreshTokenPromise) {
610
- logger.info('A token is already refreshing, waiting ...', { url });
610
+ logger$3.info('A token is already refreshing, waiting ...', { url });
611
611
  await this.refreshTokenPromise;
612
612
  }
613
613
 
@@ -627,7 +627,7 @@ class ApiRequester {
627
627
  return promise.then(async (err ) => {
628
628
  // Check if the token is still valid
629
629
  if (firstCall && this._checkTokenExpired(response, err)) {
630
- logger.warn('token expired', { error: err.reason });
630
+ logger$3.warn('token expired', { error: err.reason });
631
631
  // Replay the call after refreshing the token
632
632
  return this._replayWithNewToken(err, path, method, body, headers, parse);
633
633
  }
@@ -637,7 +637,7 @@ class ApiRequester {
637
637
  : exceptionClass.fromResponse(err, response.status);
638
638
 
639
639
  if (this.shouldLogErrors) {
640
- logger.error('API error', error);
640
+ logger$3.error('API error', error);
641
641
  }
642
642
 
643
643
  throw error;
@@ -647,7 +647,7 @@ class ApiRequester {
647
647
  return newParse(response, isJson);
648
648
  }).catch(error => {
649
649
  if (this.shouldLogErrors) {
650
- logger.error('Fetch failed', { url, options, message: error.message, stack: error.stack });
650
+ logger$3.error('Fetch failed', { url, options, message: error.message, stack: error.stack });
651
651
  }
652
652
 
653
653
  throw error;
@@ -675,13 +675,13 @@ class ApiRequester {
675
675
  ) {
676
676
  const isTokenNotFound = this._isTokenNotFound(err);
677
677
  let newPath = path;
678
- logger.info('refreshing token', { inProgress: !!this.refreshTokenPromise });
678
+ logger$3.info('refreshing token', { inProgress: !!this.refreshTokenPromise });
679
679
 
680
680
  this.refreshTokenPromise = this.refreshTokenPromise || this.refreshTokenCallback();
681
681
 
682
682
  return this.refreshTokenPromise.then(() => {
683
683
  this.refreshTokenPromise = null;
684
- logger.info('token refreshed', { isTokenNotFound });
684
+ logger$3.info('token refreshed', { isTokenNotFound });
685
685
  if (isTokenNotFound) {
686
686
  const pathParts = path.split('/');
687
687
  pathParts.pop();
@@ -1932,7 +1932,7 @@ class Contact {
1932
1932
  this[key] = old[key] || this[key];
1933
1933
  });
1934
1934
 
1935
- if (old.lineState && !this.lineState) {
1935
+ if (old.lineState) {
1936
1936
  this.lineState = old.lineState;
1937
1937
  }
1938
1938
 
@@ -3649,7 +3649,7 @@ const TRANSFER_FLOW_BLIND = 'blind';
3649
3649
 
3650
3650
  // const MINIMUM_WAZO_ENGINE_VERSION_FOR_CTI_HOLD = '20.11';
3651
3651
 
3652
- const logger$1 = IssueReporter$1 ? IssueReporter$1.loggerFor('cti-phone') : console;
3652
+ IssueReporter$1 ? IssueReporter$1.loggerFor('cti-phone') : console;
3653
3653
 
3654
3654
  /* */
3655
3655
 
@@ -4993,7 +4993,7 @@ const BLACKLIST_EVENTS = [
4993
4993
  ];
4994
4994
 
4995
4995
  const HEARTBEAT_ENGINE_VERSION = '20.09';
4996
- const logger$3 = IssueReporter$1.loggerFor('wazo-ws');
4996
+ const logger$1 = IssueReporter$1.loggerFor('wazo-ws');
4997
4997
  const messageLogger = IssueReporter$1.loggerFor('wazo-ws-message');
4998
4998
 
4999
4999
  class WebSocketClient extends Emitter {
@@ -5042,19 +5042,19 @@ class WebSocketClient extends Emitter {
5042
5042
  }
5043
5043
 
5044
5044
  connect() {
5045
- logger$3.info('connect method started', { host: this.host, token: this.token });
5045
+ logger$1.info('connect method started', { host: this.host, token: this.token });
5046
5046
  this.socket = new ReconnectingWebSocket__default['default'](this._getUrl.bind(this), [], this.options);
5047
5047
  if (this.options.binaryType) {
5048
5048
  this.socket.binaryType = this.options.binaryType;
5049
5049
  }
5050
5050
 
5051
5051
  this.socket.onopen = () => {
5052
- logger$3.info('on Wazo WS open', { method: 'connect', host: this.host });
5052
+ logger$1.info('on Wazo WS open', { method: 'connect', host: this.host });
5053
5053
  this.eventEmitter.emit(SOCKET_EVENTS.ON_OPEN);
5054
5054
  };
5055
5055
 
5056
5056
  this.socket.onerror = event => {
5057
- logger$3.error('on Wazo WS error', event.target);
5057
+ logger$1.error('on Wazo WS error', event.target);
5058
5058
  this.eventEmitter.emit(SOCKET_EVENTS.ON_ERROR, event);
5059
5059
  };
5060
5060
 
@@ -5084,7 +5084,7 @@ class WebSocketClient extends Emitter {
5084
5084
 
5085
5085
  this.socket.onclose = event => {
5086
5086
  // Can't be converted to JSON (circular structure)
5087
- logger$3.info('on Wazo WS close', {
5087
+ logger$1.info('on Wazo WS close', {
5088
5088
  reason: event.reason,
5089
5089
  code: event.code,
5090
5090
  readyState: event.target.readyState,
@@ -5102,12 +5102,12 @@ class WebSocketClient extends Emitter {
5102
5102
  };
5103
5103
 
5104
5104
  this.socket.onerror = event => {
5105
- logger$3.info('Wazo WS error', { message: event.message, code: event.code, readyState: event.target.readyState });
5105
+ logger$1.info('Wazo WS error', { message: event.message, code: event.code, readyState: event.target.readyState });
5106
5106
  };
5107
5107
  }
5108
5108
 
5109
5109
  close(force = false) {
5110
- logger$3.info('Wazo WS close', { socket: !!this.socket, host: this.host, token: this.token });
5110
+ logger$1.info('Wazo WS close', { socket: !!this.socket, host: this.host, token: this.token });
5111
5111
 
5112
5112
  if (!this.socket) {
5113
5113
  return;
@@ -5125,7 +5125,7 @@ class WebSocketClient extends Emitter {
5125
5125
 
5126
5126
  updateToken(token ) {
5127
5127
  this.token = token;
5128
- logger$3.info('Wazo WS updating token', { url: this._getUrl(), token, socket: !!this.socket });
5128
+ logger$1.info('Wazo WS updating token', { url: this._getUrl(), token, socket: !!this.socket });
5129
5129
 
5130
5130
  if (this.socket) {
5131
5131
  // If still connected, send the token to the WS
@@ -5143,7 +5143,7 @@ class WebSocketClient extends Emitter {
5143
5143
  }
5144
5144
 
5145
5145
  startHeartbeat() {
5146
- logger$3.info('Wazo WS start heartbeat', { host: this.host, token: this.token });
5146
+ logger$1.info('Wazo WS start heartbeat', { host: this.host, token: this.token });
5147
5147
 
5148
5148
  if (!this.socket) {
5149
5149
  this.heartbeat.stop();
@@ -5157,7 +5157,7 @@ class WebSocketClient extends Emitter {
5157
5157
  }
5158
5158
 
5159
5159
  stopHeartbeat() {
5160
- logger$3.info('Wazo WS stop heartbeat', { host: this.host, token: this.token });
5160
+ logger$1.info('Wazo WS stop heartbeat', { host: this.host, token: this.token });
5161
5161
 
5162
5162
  this.heartbeat.stop();
5163
5163
  }
@@ -5187,7 +5187,7 @@ class WebSocketClient extends Emitter {
5187
5187
  }
5188
5188
 
5189
5189
  reconnect(reason ) {
5190
- logger$3.info('Wazo WS reconnect', { reason, socket: !!this.socket, host: this.host, token: this.token });
5190
+ logger$1.info('Wazo WS reconnect', { reason, socket: !!this.socket, host: this.host, token: this.token });
5191
5191
  if (!this.socket) {
5192
5192
  return;
5193
5193
  }
@@ -5243,7 +5243,7 @@ class WebSocketClient extends Emitter {
5243
5243
  this.close();
5244
5244
  }
5245
5245
  const url = `wss://${this.host || ''}/api/websocketd/?token=${this.token || ''}&version=${this.version}`;
5246
- logger$3.log('Wazo WS url computed to reconnect', { url });
5246
+ logger$1.log('Wazo WS url computed to reconnect', { url });
5247
5247
 
5248
5248
  return url;
5249
5249
  }
@@ -5251,12 +5251,12 @@ class WebSocketClient extends Emitter {
5251
5251
  _onHeartbeat(message ) {
5252
5252
  if (message.payload === 'pong') {
5253
5253
  this.heartbeat.onHeartbeat();
5254
- logger$3.log('on heartbeat received from Wazo WS');
5254
+ logger$1.log('on heartbeat received from Wazo WS');
5255
5255
  }
5256
5256
  }
5257
5257
 
5258
5258
  async _onHeartbeatTimeout() {
5259
- logger$3.log('heartbeat timed out', { host: this.host, token: this.token });
5259
+ logger$1.log('heartbeat timed out', { host: this.host, token: this.token });
5260
5260
 
5261
5261
  this.close();
5262
5262
  this.eventEmitter.emit(SOCKET_EVENTS.ON_CLOSE, new Error('Websocket ping failure.'));
@@ -5377,7 +5377,7 @@ var wazoWebsocket = {
5377
5377
 
5378
5378
  /* */
5379
5379
 
5380
- const parseCandidate = (candidate ) => {
5380
+ const parseCandidate$1 = (candidate ) => {
5381
5381
  if (!candidate) {
5382
5382
  return null;
5383
5383
  }
@@ -5489,11 +5489,16 @@ class WazoSessionDescriptionHandler extends sessionDescriptionHandler.SessionDes
5489
5489
 
5490
5490
  // $FlowFixMe
5491
5491
  setRemoteSessionDescription(sessionDescription ) {
5492
- const result = super.setRemoteSessionDescription(sessionDescription);
5492
+ try {
5493
+ const result = super.setRemoteSessionDescription(sessionDescription);
5493
5494
 
5494
- this.eventEmitter.emit('setDescription', sessionDescription);
5495
+ this.eventEmitter.emit('setDescription', sessionDescription);
5495
5496
 
5496
- return result;
5497
+ return result;
5498
+ } catch (error) {
5499
+ this.logger.error('SessionDescriptionHandler.setRemoteSessionDescription error', error);
5500
+ throw error;
5501
+ }
5497
5502
  }
5498
5503
 
5499
5504
  // Overridden to avoid to fix ice-candidates missing in the SDP in react-native and chrome canary.
@@ -5531,7 +5536,7 @@ class WazoSessionDescriptionHandler extends sessionDescriptionHandler.SessionDes
5531
5536
  this.peerConnectionDelegate.onicecandidate = event => {
5532
5537
  wazoLogger.trace('onicecandidate', event.candidate ? event.candidate.candidate : { done: true });
5533
5538
  if (event.candidate) {
5534
- this.gatheredCandidates.push(parseCandidate(event.candidate.candidate));
5539
+ this.gatheredCandidates.push(parseCandidate$1(event.candidate.candidate));
5535
5540
  }
5536
5541
  };
5537
5542
 
@@ -5900,7 +5905,7 @@ const DEFAULT_ICE_TIMEOUT = 3000;
5900
5905
  const SEND_STATS_DELAY = 5000;
5901
5906
 
5902
5907
  const states = ['STATUS_NULL', 'STATUS_NEW', 'STATUS_CONNECTING', 'STATUS_CONNECTED', 'STATUS_COMPLETED'];
5903
- const logger$4 = IssueReporter$1 ? IssueReporter$1.loggerFor('webrtc-client') : console;
5908
+ const logger = IssueReporter$1 ? IssueReporter$1.loggerFor('webrtc-client') : console;
5904
5909
  const statsLogger = IssueReporter$1 ? IssueReporter$1.loggerFor('webrtc-stats') : console;
5905
5910
 
5906
5911
  // events
@@ -6076,13 +6081,13 @@ class WebRTCClient extends Emitter {
6076
6081
 
6077
6082
  createUserAgent(configOverrides ) {
6078
6083
  const webRTCConfiguration = this._createWebRTCConfiguration(configOverrides);
6079
- logger$4.info('sdk webrtc, creating UA', { webRTCConfiguration });
6084
+ logger.info('sdk webrtc, creating UA', { webRTCConfiguration });
6080
6085
 
6081
6086
  webRTCConfiguration.delegate = {
6082
6087
  onConnect: this.onConnect.bind(this),
6083
6088
  onDisconnect: this.onDisconnect.bind(this),
6084
6089
  onInvite: (invitation ) => {
6085
- logger$4.info('sdk webrtc on invite', {
6090
+ logger.info('sdk webrtc on invite', {
6086
6091
  method: 'delegate.onInvite',
6087
6092
  id: invitation.id,
6088
6093
  remoteURI: invitation.remoteURI,
@@ -6125,7 +6130,7 @@ class WebRTCClient extends Emitter {
6125
6130
  }
6126
6131
 
6127
6132
  onConnect() {
6128
- logger$4.info('sdk webrtc connected', { method: 'delegate.onConnect' });
6133
+ logger.info('sdk webrtc connected', { method: 'delegate.onConnect' });
6129
6134
  this.eventEmitter.emit(CONNECTED);
6130
6135
  if (!this.isRegistered() && this.registerer && this.registerer.waiting) {
6131
6136
  this.registerer.waitingToggle(false);
@@ -6134,7 +6139,7 @@ class WebRTCClient extends Emitter {
6134
6139
  }
6135
6140
 
6136
6141
  async onDisconnect(error ) {
6137
- logger$4.info('sdk webrtc disconnected', { method: 'delegate.onConnect', error });
6142
+ logger.info('sdk webrtc disconnected', { method: 'delegate.onConnect', error });
6138
6143
  this.connectionPromise = null;
6139
6144
  // The UA will attempt to reconnect automatically when an error occurred
6140
6145
  this.eventEmitter.emit(DISCONNECTED, error);
@@ -6159,37 +6164,37 @@ class WebRTCClient extends Emitter {
6159
6164
  };
6160
6165
 
6161
6166
  if (this.skipRegister) {
6162
- logger$4.info('sdk webrtc skip register...', logInfo);
6167
+ logger.info('sdk webrtc skip register...', logInfo);
6163
6168
  return Promise.resolve();
6164
6169
  }
6165
6170
 
6166
- logger$4.info('sdk webrtc registering...', logInfo);
6171
+ logger.info('sdk webrtc registering...', logInfo);
6167
6172
 
6168
6173
  if (!this.userAgent) {
6169
- logger$4.info('sdk webrtc recreating User Agent');
6174
+ logger.info('sdk webrtc recreating User Agent');
6170
6175
  this.userAgent = this.createUserAgent(this.uaConfigOverrides);
6171
6176
  }
6172
6177
  if (!this.userAgent || this.isRegistered()) {
6173
- logger$4.info('sdk webrtc registering aborted, already registered or no UA can be created');
6178
+ logger.info('sdk webrtc registering aborted, already registered or no UA can be created');
6174
6179
  return Promise.resolve();
6175
6180
  }
6176
6181
 
6177
6182
  if (this.connectionPromise || (this.registerer && this.registerer.waiting)) {
6178
- logger$4.info('sdk webrtc registering aborted due to a registration in progress.');
6183
+ logger.info('sdk webrtc registering aborted due to a registration in progress.');
6179
6184
  return Promise.resolve();
6180
6185
  }
6181
6186
 
6182
6187
  const registerOptions = this._isWeb() ? {} : { extraContactHeaderParams: ['mobility=mobile'] };
6183
6188
 
6184
6189
  const onRegisterFailed = () => {
6185
- logger$4.info('sdk webrtc registering failed', { tries, registerer: !!this.registerer });
6190
+ logger.info('sdk webrtc registering failed', { tries, registerer: !!this.registerer });
6186
6191
  this.connectionPromise = null;
6187
6192
  if (this.registerer && this.registerer.waiting) {
6188
6193
  this.registerer.waitingToggle(false);
6189
6194
  }
6190
6195
 
6191
6196
  if (tries <= MAX_REGISTER_TRIES) {
6192
- logger$4.info('sdk webrtc registering, retrying...', { tries });
6197
+ logger.info('sdk webrtc registering, retrying...', { tries });
6193
6198
  setTimeout(() => this.register(tries + 1), 300);
6194
6199
  }
6195
6200
  };
@@ -6198,18 +6203,18 @@ class WebRTCClient extends Emitter {
6198
6203
  // Avoid race condition with the close method called just before register and setting userAgent to null
6199
6204
  // during the resolution of the primise.
6200
6205
  if (!this.userAgent) {
6201
- logger$4.info('sdk webrtc recreating User Agent after connection');
6206
+ logger.info('sdk webrtc recreating User Agent after connection');
6202
6207
  this.userAgent = this.createUserAgent(this.uaConfigOverrides);
6203
6208
  }
6204
6209
 
6205
- logger$4.info('sdk webrtc registering, transport connected', { registerOptions, ua: !!this.userAgent });
6210
+ logger.info('sdk webrtc registering, transport connected', { registerOptions, ua: !!this.userAgent });
6206
6211
  this.registerer = new registerer.Registerer(this.userAgent, registerOptions);
6207
6212
  this.connectionPromise = null;
6208
6213
  this._monkeyPatchRegisterer(this.registerer);
6209
6214
 
6210
6215
  // Bind registerer events
6211
6216
  this.registerer.stateChange.addListener(newState => {
6212
- logger$4.info('sdk webrtc registering, state changed', { newState });
6217
+ logger.info('sdk webrtc registering, state changed', { newState });
6213
6218
 
6214
6219
  if (newState === registererState.RegistererState.Registered && this.registerer
6215
6220
  && this.registerer.state === registererState.RegistererState.Registered) {
@@ -6222,7 +6227,7 @@ class WebRTCClient extends Emitter {
6222
6227
  const options = {
6223
6228
  requestDelegate: {
6224
6229
  onReject: response => {
6225
- logger$4.error('sdk webrtc registering, rejected', { response });
6230
+ logger.error('sdk webrtc registering, rejected', { response });
6226
6231
 
6227
6232
  onRegisterFailed();
6228
6233
  },
@@ -6230,13 +6235,13 @@ class WebRTCClient extends Emitter {
6230
6235
  };
6231
6236
 
6232
6237
  return this.registerer.register(options).catch((e) => {
6233
- logger$4.error('sdk webrtc registering, error', e);
6238
+ logger.error('sdk webrtc registering, error', e);
6234
6239
 
6235
6240
  this.eventEmitter.emit(REGISTRATION_FAILED);
6236
6241
  return e;
6237
6242
  });
6238
6243
  }).catch(error => {
6239
- logger$4.error('sdk webrtc registering, transport error', error);
6244
+ logger.error('sdk webrtc registering, transport error', error);
6240
6245
  onRegisterFailed();
6241
6246
  });
6242
6247
  }
@@ -6265,21 +6270,21 @@ class WebRTCClient extends Emitter {
6265
6270
  }
6266
6271
 
6267
6272
  unregister() {
6268
- logger$4.info('sdk webrtc unregistering..', { userAgent: !!this.userAgent, registerer: !!this.registerer });
6273
+ logger.info('sdk webrtc unregistering..', { userAgent: !!this.userAgent, registerer: !!this.registerer });
6269
6274
  if (!this.registerer) {
6270
6275
  return Promise.resolve();
6271
6276
  }
6272
6277
 
6273
6278
  try {
6274
6279
  return this.registerer.unregister().then(() => {
6275
- logger$4.info('sdk webrtc unregistered');
6280
+ logger.info('sdk webrtc unregistered');
6276
6281
  this._cleanupRegister();
6277
6282
  }).catch(e => {
6278
- logger$4.error('sdk webrtc unregistering, promise error', e);
6283
+ logger.error('sdk webrtc unregistering, promise error', e);
6279
6284
  this._cleanupRegister();
6280
6285
  });
6281
6286
  } catch (e) {
6282
- logger$4.error('sdk webrtc unregistering, error', e);
6287
+ logger.error('sdk webrtc unregistering, error', e);
6283
6288
  // Avoid issue with `undefined is not an object (evaluating 'new.target.prototype')` when triggering a new
6284
6289
  // error when the registerer is in a bad state
6285
6290
  this._cleanupRegister();
@@ -6287,7 +6292,7 @@ class WebRTCClient extends Emitter {
6287
6292
  }
6288
6293
 
6289
6294
  stop() {
6290
- logger$4.info('sdk webrtc stop', { userAgent: !!this.userAgent });
6295
+ logger.info('sdk webrtc stop', { userAgent: !!this.userAgent });
6291
6296
  if (!this.userAgent) {
6292
6297
  return Promise.resolve();
6293
6298
  }
@@ -6295,12 +6300,12 @@ class WebRTCClient extends Emitter {
6295
6300
  return this.userAgent.stop().then(() => {
6296
6301
  return this._cleanupRegister();
6297
6302
  }).catch(e => {
6298
- logger$4.warn('sdk webrtc stop, error', { message: e.message, stack: e.stack });
6303
+ logger.warn('sdk webrtc stop, error', { message: e.message, stack: e.stack });
6299
6304
  });
6300
6305
  }
6301
6306
 
6302
6307
  call(number , enableVideo , audioOnly = false, conference = false) {
6303
- logger$4.info('sdk webrtc creating call', { number, enableVideo, audioOnly });
6308
+ logger.info('sdk webrtc creating call', { number, enableVideo, audioOnly, conference });
6304
6309
  const inviterOptions = {
6305
6310
  sessionDescriptionHandlerOptionsReInvite: {
6306
6311
  conference,
@@ -6331,7 +6336,7 @@ class WebRTCClient extends Emitter {
6331
6336
  this._onAccepted(session, response.session, true);
6332
6337
  },
6333
6338
  onReject: (response ) => {
6334
- logger$4.info('on call rejected', { id: session.id, fromTag: session.fromTag });
6339
+ logger.info('on call rejected', { id: session.id, fromTag: session.fromTag });
6335
6340
  this._stopSendingStats(session);
6336
6341
  this.stopNetworkMonitoring(session);
6337
6342
 
@@ -6354,11 +6359,11 @@ class WebRTCClient extends Emitter {
6354
6359
  }
6355
6360
 
6356
6361
  answer(session , enableVideo ) {
6357
- logger$4.info('sdk webrtc answer call', { id: session.id, enableVideo });
6362
+ logger.info('sdk webrtc answer call', { id: session.id, enableVideo });
6358
6363
 
6359
6364
  if (!session || !session.accept) {
6360
6365
  const error = 'No session to answer, or not an invitation';
6361
- logger$4.warn(error);
6366
+ logger.warn(error);
6362
6367
  return Promise.reject(new Error(error));
6363
6368
  }
6364
6369
  const options = {
@@ -6368,15 +6373,15 @@ class WebRTCClient extends Emitter {
6368
6373
  return session.accept(options).then(() => {
6369
6374
  if (session.isCanceled) {
6370
6375
  const message = 'accepted a canceled session (or was canceled during the accept phase).';
6371
- logger$4.error(message, { id: session.id });
6376
+ logger.error(message, { id: session.id });
6372
6377
  this.onCallEnded(session);
6373
6378
 
6374
6379
  throw new CanceledCallError(message);
6375
6380
  }
6376
- logger$4.info('sdk webrtc answer, accepted.');
6381
+ logger.info('sdk webrtc answer, accepted.');
6377
6382
  this._onAccepted(session);
6378
6383
  }).catch(e => {
6379
- logger$4.error(`answer call error for ${session ? session.id : 'n/a'}`, e);
6384
+ logger.error(`answer call error for ${session ? session.id : 'n/a'}`, e);
6380
6385
 
6381
6386
  throw e;
6382
6387
  });
@@ -6384,7 +6389,7 @@ class WebRTCClient extends Emitter {
6384
6389
 
6385
6390
  hangup(session ) {
6386
6391
  const { state, id } = session;
6387
- logger$4.info('sdk webrtc hangup call', { id, state });
6392
+ logger.info('sdk webrtc hangup call', { id, state });
6388
6393
 
6389
6394
  try {
6390
6395
  this._stopSendingStats(session);
@@ -6413,7 +6418,7 @@ class WebRTCClient extends Emitter {
6413
6418
 
6414
6419
  return bye();
6415
6420
  } catch (error) {
6416
- logger$4.warn('sdk webrtc hangup, error', error);
6421
+ logger.warn('sdk webrtc hangup, error', error);
6417
6422
  }
6418
6423
 
6419
6424
  return null;
@@ -6431,7 +6436,7 @@ class WebRTCClient extends Emitter {
6431
6436
  // Fetch and emit an event at `interval` with session network stats
6432
6437
  startNetworkMonitoring(session , interval = 1000) {
6433
6438
  const sessionId = this.getSipSessionId(session);
6434
- logger$4.info('starting network inspection', { id: sessionId });
6439
+ logger.info('starting network inspection', { id: sessionId });
6435
6440
 
6436
6441
  this.sessionNetworkStats[sessionId] = [];
6437
6442
 
@@ -6441,7 +6446,7 @@ class WebRTCClient extends Emitter {
6441
6446
  stopNetworkMonitoring(session ) {
6442
6447
  const sessionId = this.getSipSessionId(session);
6443
6448
  const exists = sessionId in this.networkMonitoringInterval;
6444
- logger$4.info('stopping network inspection', { id: sessionId, exists });
6449
+ logger.info('stopping network inspection', { id: sessionId, exists });
6445
6450
 
6446
6451
  if (exists) {
6447
6452
  clearInterval(this.networkMonitoringInterval[sessionId]);
@@ -6451,17 +6456,17 @@ class WebRTCClient extends Emitter {
6451
6456
  }
6452
6457
 
6453
6458
  reject(session ) {
6454
- logger$4.info('sdk webrtc reject call', { id: session.id });
6459
+ logger.info('sdk webrtc reject call', { id: session.id });
6455
6460
 
6456
6461
  try {
6457
6462
  return session.reject ? session.reject() : session.cancel();
6458
6463
  } catch (e) {
6459
- logger$4.warn('Error when rejecting call', e.message, e.stack);
6464
+ logger.warn('Error when rejecting call', e.message, e.stack);
6460
6465
  }
6461
6466
  }
6462
6467
 
6463
6468
  async close() {
6464
- logger$4.info('sdk webrtc closing client', { userAgent: !!this.userAgent });
6469
+ logger.info('sdk webrtc closing client', { userAgent: !!this.userAgent });
6465
6470
  this._cleanupMedia();
6466
6471
  this.connectionPromise = null;
6467
6472
 
@@ -6492,7 +6497,7 @@ class WebRTCClient extends Emitter {
6492
6497
  // eg: "INVITE not rejectable in state Completed"
6493
6498
  }
6494
6499
  this.userAgent = null;
6495
- logger$4.info('sdk webrtc client closed');
6500
+ logger.info('sdk webrtc client closed');
6496
6501
  }
6497
6502
 
6498
6503
  getNumber(session ) {
@@ -6505,13 +6510,13 @@ class WebRTCClient extends Emitter {
6505
6510
  }
6506
6511
 
6507
6512
  mute(session ) {
6508
- logger$4.info('sdk webrtc mute', { id: session.id });
6513
+ logger.info('sdk webrtc mute', { id: session.id });
6509
6514
 
6510
6515
  this._toggleAudio(session, true);
6511
6516
  }
6512
6517
 
6513
6518
  unmute(session ) {
6514
- logger$4.info('sdk webrtc unmute', { id: session.id });
6519
+ logger.info('sdk webrtc unmute', { id: session.id });
6515
6520
 
6516
6521
  this._toggleAudio(session, false);
6517
6522
  }
@@ -6551,13 +6556,13 @@ class WebRTCClient extends Emitter {
6551
6556
  }
6552
6557
 
6553
6558
  toggleCameraOn(session ) {
6554
- logger$4.info('sdk webrtc toggle camera on', { id: session.id });
6559
+ logger.info('sdk webrtc toggle camera on', { id: session.id });
6555
6560
 
6556
6561
  this._toggleVideo(session, false);
6557
6562
  }
6558
6563
 
6559
6564
  toggleCameraOff(session ) {
6560
- logger$4.info('sdk webrtc toggle camera off', { id: session.id });
6565
+ logger.info('sdk webrtc toggle camera off', { id: session.id });
6561
6566
 
6562
6567
  this._toggleVideo(session, true);
6563
6568
  }
@@ -6566,7 +6571,7 @@ class WebRTCClient extends Emitter {
6566
6571
  const sessionId = this.getSipSessionId(session);
6567
6572
  const hasVideo = hadVideo || this.hasLocalVideo(sessionId);
6568
6573
 
6569
- logger$4.info('sdk webrtc hold', {
6574
+ logger.info('sdk webrtc hold', {
6570
6575
  sessionId,
6571
6576
  keys: Object.keys(this.heldSessions),
6572
6577
  pendingReinvite: !!session.pendingReinvite,
@@ -6615,7 +6620,7 @@ class WebRTCClient extends Emitter {
6615
6620
  const sessionId = this.getSipSessionId(session);
6616
6621
  const hasVideo = sessionId in this.heldSessions && this.heldSessions[sessionId].hasVideo;
6617
6622
 
6618
- logger$4.info('sdk webrtc unhold', {
6623
+ logger.info('sdk webrtc unhold', {
6619
6624
  sessionId,
6620
6625
  keys: Object.keys(this.heldSessions),
6621
6626
  pendingReinvite: !!session.pendingReinvite,
@@ -6763,7 +6768,7 @@ class WebRTCClient extends Emitter {
6763
6768
  if (!session.sessionDescriptionHandler) {
6764
6769
  return;
6765
6770
  }
6766
- logger$4.info('Sending DTMF', {
6771
+ logger.info('Sending DTMF', {
6767
6772
  id: this.getSipSessionId(session),
6768
6773
  tone,
6769
6774
  });
@@ -6779,7 +6784,7 @@ class WebRTCClient extends Emitter {
6779
6784
  transfer(session , target ) {
6780
6785
  this.hold(session);
6781
6786
 
6782
- logger$4.info('Transfering a session', {
6787
+ logger.info('Transfering a session', {
6783
6788
  id: this.getSipSessionId(session),
6784
6789
  target,
6785
6790
  });
@@ -6801,17 +6806,17 @@ class WebRTCClient extends Emitter {
6801
6806
  atxfer(session ) {
6802
6807
  this.hold(session);
6803
6808
 
6804
- logger$4.info('webrtc transfer started', { id: this.getSipSessionId(session) });
6809
+ logger.info('webrtc transfer started', { id: this.getSipSessionId(session) });
6805
6810
 
6806
6811
  const result = {
6807
6812
  newSession: null,
6808
6813
  init: async (target ) => {
6809
- logger$4.info('webrtc transfer initialized', { id: this.getSipSessionId(session), target });
6814
+ logger.info('webrtc transfer initialized', { id: this.getSipSessionId(session), target });
6810
6815
 
6811
6816
  result.newSession = await this.call(target);
6812
6817
  },
6813
6818
  complete: () => {
6814
- logger$4.info('webrtc transfer completed', {
6819
+ logger.info('webrtc transfer completed', {
6815
6820
  id: this.getSipSessionId(session),
6816
6821
  referId: this.getSipSessionId(result.newSession),
6817
6822
  });
@@ -6832,7 +6837,7 @@ class WebRTCClient extends Emitter {
6832
6837
  return;
6833
6838
  }
6834
6839
 
6835
- logger$4.info('send WebRTC message', { sipId: sipSession.id, contentType });
6840
+ logger.info('send WebRTC message', { sipId: sipSession.id, contentType });
6836
6841
 
6837
6842
  try {
6838
6843
  sipSession.message({
@@ -6874,7 +6879,7 @@ class WebRTCClient extends Emitter {
6874
6879
  }
6875
6880
 
6876
6881
  changeAudioOutputVolume(volume ) {
6877
- logger$4.info('Changing audio output volume', { volume });
6882
+ logger.info('Changing audio output volume', { volume });
6878
6883
 
6879
6884
  Object.values(this.audioElements).forEach(audioElement => {
6880
6885
  if (audioElement instanceof HTMLAudioElement) {
@@ -6886,7 +6891,7 @@ class WebRTCClient extends Emitter {
6886
6891
  }
6887
6892
 
6888
6893
  changeAudioOutputDevice(id ) {
6889
- logger$4.info('Changing audio output device', { id });
6894
+ logger.info('Changing audio output device', { id });
6890
6895
 
6891
6896
  Object.values(this.audioElements).forEach(audioElement => {
6892
6897
  // `setSinkId` method is not included in any flow type definitions for HTMLAudioElements but is a valid method
@@ -6903,7 +6908,7 @@ class WebRTCClient extends Emitter {
6903
6908
 
6904
6909
  changeAudioInputDevice(id , session ) {
6905
6910
  const currentId = this.getAudioDeviceId();
6906
- logger$4.info('setting audio input device', { id, currentId, session: !!session });
6911
+ logger.info('setting audio input device', { id, currentId, session: !!session });
6907
6912
 
6908
6913
  if (id === currentId) {
6909
6914
  return null;
@@ -6949,7 +6954,7 @@ class WebRTCClient extends Emitter {
6949
6954
 
6950
6955
  setVideoInputDevice(id ) {
6951
6956
  const currentId = this.getVideoDeviceId();
6952
- logger$4.info('setting video input device', { id, currentId });
6957
+ logger.info('setting video input device', { id, currentId });
6953
6958
 
6954
6959
  if (id === currentId) {
6955
6960
  return null;
@@ -6974,7 +6979,7 @@ class WebRTCClient extends Emitter {
6974
6979
  const sessionId = this.getSipSessionId(session);
6975
6980
  const localStream = this.getLocalStream(sessionId);
6976
6981
 
6977
- logger$4.info('changing video input device', { id, sessionId });
6982
+ logger.info('changing video input device', { id, sessionId });
6978
6983
 
6979
6984
  // Release old video stream
6980
6985
  if (localStream) {
@@ -7042,7 +7047,7 @@ class WebRTCClient extends Emitter {
7042
7047
  const shouldDoScreenSharing = newConstraints && newConstraints.screen;
7043
7048
  const desktop = newConstraints && newConstraints.desktop;
7044
7049
 
7045
- logger$4.info('Sending reinvite', {
7050
+ logger.info('Sending reinvite', {
7046
7051
  id: this.getSipSessionId(sipSession),
7047
7052
  newConstraints,
7048
7053
  conference,
@@ -7080,7 +7085,7 @@ class WebRTCClient extends Emitter {
7080
7085
  sipSession.incomingInviteRequest.message.body = response.message.body;
7081
7086
  }
7082
7087
 
7083
- logger$4.info('on re-INVITE accepted', {
7088
+ logger.info('on re-INVITE accepted', {
7084
7089
  id: this.getSipSessionId(sipSession),
7085
7090
  wasMuted,
7086
7091
  shouldDoScreenSharing,
@@ -7255,7 +7260,7 @@ class WebRTCClient extends Emitter {
7255
7260
  }
7256
7261
 
7257
7262
  startHeartbeat() {
7258
- logger$4.info('sdk webrtc start heartbeat', { userAgent: !!this.userAgent });
7263
+ logger.info('sdk webrtc start heartbeat', { userAgent: !!this.userAgent });
7259
7264
  if (!this.userAgent) {
7260
7265
  this.heartbeat.stop();
7261
7266
  return;
@@ -7268,7 +7273,7 @@ class WebRTCClient extends Emitter {
7268
7273
  }
7269
7274
 
7270
7275
  stopHeartbeat() {
7271
- logger$4.info('sdk webrtc stop heartbeat');
7276
+ logger.info('sdk webrtc stop heartbeat');
7272
7277
  this.heartbeat.stop();
7273
7278
  }
7274
7279
 
@@ -7289,7 +7294,7 @@ class WebRTCClient extends Emitter {
7289
7294
  }
7290
7295
 
7291
7296
  attemptReconnection() {
7292
- logger$4.info('attempt reconnection', { userAgent: !!this.userAgent });
7297
+ logger.info('attempt reconnection', { userAgent: !!this.userAgent });
7293
7298
  if (!this.userAgent) {
7294
7299
  return;
7295
7300
  }
@@ -7314,7 +7319,7 @@ class WebRTCClient extends Emitter {
7314
7319
  return;
7315
7320
  }
7316
7321
 
7317
- logger$4.info('setting local media stream', {
7322
+ logger.info('setting local media stream', {
7318
7323
  sipSessionId,
7319
7324
  tracks: newStream ? newStream.getTracks() : null,
7320
7325
  });
@@ -7331,7 +7336,7 @@ class WebRTCClient extends Emitter {
7331
7336
 
7332
7337
  const oldStream = this.getLocalStream(sipSessionId);
7333
7338
 
7334
- logger$4.info('updating local stream', {
7339
+ logger.info('updating local stream', {
7335
7340
  sipSessionId,
7336
7341
  oldStream: !!oldStream,
7337
7342
  tracks: newStream.getTracks(),
@@ -7351,7 +7356,7 @@ class WebRTCClient extends Emitter {
7351
7356
  const remoteStream = this.getRemoteStream(sessionId);
7352
7357
  const pc = this.getPeerConnection(sessionId);
7353
7358
 
7354
- logger$4.info('Updating remote stream', {
7359
+ logger.info('Updating remote stream', {
7355
7360
  sessionId,
7356
7361
  tracks: remoteStream ? remoteStream.getTracks() : null,
7357
7362
  receiverTracks: pc && pc.getReceivers ? pc.getReceivers().map(receiver => receiver.track) : null,
@@ -7376,14 +7381,16 @@ class WebRTCClient extends Emitter {
7376
7381
  const screenSharing = constraints && 'screen' in constraints ? constraints.screen : false;
7377
7382
  const isDesktop = constraints && 'desktop' in constraints ? constraints.desktop : false;
7378
7383
  const withAudio = constraints && 'audio' in constraints ? constraints.audio : true;
7384
+ const mandatoryVideo = constraints && typeof constraints.video === 'object' ? constraints.video.mandatory : {};
7379
7385
 
7380
- logger$4.info('Retrieving media a configuration', { enableVideo, screenSharing, isDesktop, withAudio, constraints });
7386
+ logger.info('Retrieving media a configuration', { enableVideo, screenSharing, isDesktop, withAudio, constraints });
7381
7387
 
7382
7388
  return {
7383
7389
  constraints: {
7384
7390
  // Exact constraint are not supported with `getDisplayMedia` and we must have a video=false in desktop screenshare
7385
7391
  audio: screenSharing ? !isDesktop : (withAudio ? this._getAudioConstraints() : false),
7386
- video: screenSharing ? (isDesktop ? ({ mandatory: { chromeMediaSource: 'desktop' } }) : { cursor: 'always' })
7392
+ video: screenSharing ? (isDesktop
7393
+ ? ({ mandatory: { chromeMediaSource: 'desktop', ...(mandatoryVideo || {}) } }) : { cursor: 'always' })
7387
7394
  : this._getVideoConstraints(enableVideo),
7388
7395
  screen: screenSharing,
7389
7396
  desktop: isDesktop,
@@ -7426,7 +7433,7 @@ class WebRTCClient extends Emitter {
7426
7433
  }
7427
7434
 
7428
7435
  _onTransportError() {
7429
- logger$4.error('on transport error');
7436
+ logger.error('on transport error');
7430
7437
  this.eventEmitter.emit(TRANSPORT_ERROR);
7431
7438
  this.attemptReconnection();
7432
7439
  }
@@ -7435,7 +7442,7 @@ class WebRTCClient extends Emitter {
7435
7442
  const body = message && typeof message === 'object' ? message.data : message;
7436
7443
  if (body && body.indexOf('200 OK') !== -1) {
7437
7444
  if (this.hasHeartbeat()) {
7438
- logger$4.info('on heartbeat received from Asterisk', { hasHeartbeat: this.hasHeartbeat() });
7445
+ logger.info('on heartbeat received from Asterisk', { hasHeartbeat: this.hasHeartbeat() });
7439
7446
 
7440
7447
  this.heartbeat.onHeartbeat();
7441
7448
  if (this.heartbeatCb) {
@@ -7446,7 +7453,7 @@ class WebRTCClient extends Emitter {
7446
7453
  }
7447
7454
 
7448
7455
  async _onHeartbeatTimeout() {
7449
- logger$4.info('sdk webrtc heartbeat timed out', { userAgent: !!this.userAgent, cb: !!this.heartbeatTimeoutCb });
7456
+ logger.info('sdk webrtc heartbeat timed out', { userAgent: !!this.userAgent, cb: !!this.heartbeatTimeoutCb });
7450
7457
 
7451
7458
  if (this.heartbeatTimeoutCb) {
7452
7459
  this.heartbeatTimeoutCb();
@@ -7458,7 +7465,7 @@ class WebRTCClient extends Emitter {
7458
7465
  try {
7459
7466
  await this.userAgent.transport.disconnect();
7460
7467
  } catch (e) {
7461
- logger$4.error('Transport disconnection after heartbeat timeout, error', e);
7468
+ logger.error('Transport disconnection after heartbeat timeout, error', e);
7462
7469
  }
7463
7470
  }
7464
7471
 
@@ -7491,31 +7498,31 @@ class WebRTCClient extends Emitter {
7491
7498
  }
7492
7499
 
7493
7500
  _connectIfNeeded() {
7494
- logger$4.info('connect if needed, checking', { connected: this.isConnected() });
7501
+ logger.info('connect if needed, checking', { connected: this.isConnected() });
7495
7502
  if (!this.userAgent) {
7496
- logger$4.info('need to recreate User Agent');
7503
+ logger.info('need to recreate User Agent');
7497
7504
  this.userAgent = this.createUserAgent(this.uaConfigOverrides);
7498
7505
  }
7499
7506
 
7500
7507
  if (this.isConnected()) {
7501
- logger$4.info('webrtc sdk, already connected');
7508
+ logger.info('webrtc sdk, already connected');
7502
7509
  return Promise.resolve();
7503
7510
  }
7504
7511
 
7505
7512
  if (this.isConnecting()) {
7506
- logger$4.info('webrtc sdk, already connecting...');
7513
+ logger.info('webrtc sdk, already connecting...');
7507
7514
 
7508
7515
  this.connectionPromise = this.userAgent.transport.connectPromise;
7509
7516
  return this.connectionPromise;
7510
7517
  }
7511
7518
 
7512
7519
  if (this.connectionPromise) {
7513
- logger$4.info('webrtc sdk, connection promise connecting...');
7520
+ logger.info('webrtc sdk, connection promise connecting...');
7514
7521
  // $FlowFixMe
7515
7522
  return this.connectionPromise;
7516
7523
  }
7517
7524
 
7518
- logger$4.info('WebRTC UA needs to connect');
7525
+ logger.info('WebRTC UA needs to connect');
7519
7526
 
7520
7527
  // Force UA to reconnect
7521
7528
  if (this.userAgent && this.userAgent.state !== userAgentState.UserAgentState.Stopped) {
@@ -7640,7 +7647,7 @@ class WebRTCClient extends Emitter {
7640
7647
 
7641
7648
  sdh.peerConnectionDelegate = {
7642
7649
  onicecandidateerror: (error ) => {
7643
- logger$4.error('on icecandidate error', {
7650
+ logger.error('on icecandidate error', {
7644
7651
  address: error.address,
7645
7652
  port: error.port,
7646
7653
  errorCode: error.errorCode,
@@ -7669,7 +7676,7 @@ class WebRTCClient extends Emitter {
7669
7676
  updatedNumber = session.assertedIdentity.uri.normal.user;
7670
7677
  updatedCalleeName = session.assertedIdentity.displayName || updatedNumber;
7671
7678
  }
7672
- logger$4.info('re-invite received', { updatedCalleeName, updatedNumber, hadRemoteVideo });
7679
+ logger.info('re-invite received', { updatedCalleeName, updatedNumber, hadRemoteVideo });
7673
7680
 
7674
7681
  // Useful to know if it's a video upgrade or an unhold from a remote peer with a video stream
7675
7682
 
@@ -7690,7 +7697,7 @@ class WebRTCClient extends Emitter {
7690
7697
  }
7691
7698
 
7692
7699
  _onAccepted(session , sessionDialog , withEvent = true) {
7693
- logger$4.info('on call accepted', { id: session.id, remoteTag: session.remoteTag });
7700
+ logger.info('on call accepted', { id: session.id, remoteTag: session.remoteTag });
7694
7701
 
7695
7702
  this.storeSipSession(session);
7696
7703
 
@@ -7702,7 +7709,7 @@ class WebRTCClient extends Emitter {
7702
7709
  const onTrack = (event ) => {
7703
7710
  const isAudioOnly = this._isAudioOnly(session);
7704
7711
  const { kind, label, readyState, id, muted } = event.track;
7705
- logger$4.info('on track event', { isAudioOnly, kind, label, readyState, id, muted });
7712
+ logger.info('on track event', { isAudioOnly, kind, label, readyState, id, muted });
7706
7713
 
7707
7714
  // Stop video track in audio only mode
7708
7715
  if (isAudioOnly && kind === 'video') {
@@ -7718,12 +7725,14 @@ class WebRTCClient extends Emitter {
7718
7725
 
7719
7726
  session.sessionDescriptionHandler.remoteMediaStream.onaddtrack = onTrack;
7720
7727
 
7721
- pc.oniceconnectionstatechange = () => {
7722
- logger$4.info('on ice connection state changed', { state: pc.iceConnectionState });
7723
- if (pc.iceConnectionState === 'disconnected') {
7724
- this.eventEmitter.emit(ON_DISCONNECTED);
7725
- }
7726
- };
7728
+ if (pc) {
7729
+ pc.oniceconnectionstatechange = () => {
7730
+ logger.info('on ice connection state changed', { state: pc.iceConnectionState });
7731
+ if (pc.iceConnectionState === 'disconnected') {
7732
+ this.eventEmitter.emit(ON_DISCONNECTED);
7733
+ }
7734
+ };
7735
+ }
7727
7736
 
7728
7737
  if (withEvent) {
7729
7738
  this.eventEmitter.emit(ACCEPTED, session, sessionDialog);
@@ -7892,10 +7901,10 @@ class WebRTCClient extends Emitter {
7892
7901
 
7893
7902
  _stopSendingStats(session ) {
7894
7903
  const sessionId = this.getSipSessionId(session);
7895
- logger$4.trace('Check for stopping stats', { sessionId, ids: Object.keys(this.statsIntervals) });
7904
+ logger.trace('Check for stopping stats', { sessionId, ids: Object.keys(this.statsIntervals) });
7896
7905
 
7897
7906
  if (sessionId in this.statsIntervals) {
7898
- logger$4.trace('Stop sending stats for call', { sessionId });
7907
+ logger.trace('Stop sending stats for call', { sessionId });
7899
7908
  this.statsIntervals[sessionId]();
7900
7909
  delete this.statsIntervals[sessionId];
7901
7910
  }
@@ -7911,7 +7920,7 @@ class WebRTCClient extends Emitter {
7911
7920
  try {
7912
7921
  await this.userAgent.transport.disconnect();
7913
7922
  } catch (e) {
7914
- logger$4.error('WebRTC transport disconnect, error', e);
7923
+ logger.error('WebRTC transport disconnect, error', e);
7915
7924
  }
7916
7925
  }
7917
7926
  }
@@ -7933,13 +7942,17 @@ class WebRTCClient extends Emitter {
7933
7942
  const nbStats = this.sessionNetworkStats[sessionId].length;
7934
7943
  const lastNetworkStats = this.sessionNetworkStats[sessionId][nbStats - 1];
7935
7944
  const lastAudioSent = lastNetworkStats ? lastNetworkStats.audioBytesSent : 0;
7945
+ const lastAudioContentSent = lastNetworkStats ? lastNetworkStats.audioContentSent : 0;
7936
7946
  const lastVideoSent = lastNetworkStats ? lastNetworkStats.videoBytesSent : 0;
7937
7947
  const lastAudioReceived = lastNetworkStats ? lastNetworkStats.audioBytesReceived : 0;
7948
+ const lastAudioContentReceived = lastNetworkStats ? lastNetworkStats.audioContentReceived : 0;
7938
7949
  const lastVideoReceived = lastNetworkStats ? lastNetworkStats.videoBytesReceived : 0;
7939
7950
  const lastTransportSent = lastNetworkStats ? lastNetworkStats.transportSent : 0;
7940
7951
  const lastTransportReceived = lastNetworkStats ? lastNetworkStats.transportReceived : 0;
7941
- let audioBytesSent = 0;
7942
- let audioBytesReceived = 0;
7952
+ let audioBytesSent = 0; // content + header
7953
+ let audioBytesReceived = 0; // content + header
7954
+ let audioContentSent = 0; // useful to detect blank call
7955
+ let audioContentReceived = 0;
7943
7956
  let videoBytesSent = 0;
7944
7957
  let videoBytesReceived = 0;
7945
7958
  let transportSent = 0;
@@ -7949,6 +7962,7 @@ class WebRTCClient extends Emitter {
7949
7962
  stats.forEach(report => {
7950
7963
  if (report.type === 'outbound-rtp' && report.kind === 'audio') {
7951
7964
  audioBytesSent += Number(report.bytesSent) + Number(report.headerBytesSent);
7965
+ audioContentSent += Number(report.bytesSent);
7952
7966
  }
7953
7967
  if (report.type === 'remote-outbound-rtp' && report.kind === 'audio') {
7954
7968
  audioBytesSent += Number(report.bytesSent);
@@ -7960,6 +7974,7 @@ class WebRTCClient extends Emitter {
7960
7974
  packetsLost += Number(report.packetsLost);
7961
7975
  networkStats.packetsReceived = Number(report.packetsReceived);
7962
7976
  audioBytesReceived += Number(report.bytesReceived) + Number(report.headerBytesReceived);
7977
+ audioContentReceived += Number(report.bytesReceived);
7963
7978
  }
7964
7979
  if (report.type === 'inbound-rtp' && report.kind === 'video') {
7965
7980
  videoBytesReceived += Number(report.bytesReceived) + Number(report.headerBytesReceived);
@@ -7988,10 +8003,17 @@ class WebRTCClient extends Emitter {
7988
8003
  });
7989
8004
 
7990
8005
  networkStats.packetsLost = packetsLost;
8006
+
7991
8007
  networkStats.totalAudioBytesSent = audioBytesSent;
7992
8008
  networkStats.audioBytesSent = audioBytesSent - lastAudioSent;
7993
8009
  networkStats.totalAudioBytesReceived = audioBytesReceived - lastAudioReceived;
7994
8010
  networkStats.audioBytesReceived = audioBytesReceived;
8011
+
8012
+ networkStats.totalAudioContentSent = audioContentSent;
8013
+ networkStats.audioContentSent = audioContentSent - lastAudioContentSent;
8014
+ networkStats.totalAudioBytesReceived = audioContentReceived - lastAudioContentReceived;
8015
+ networkStats.audioContentReceived = audioContentReceived;
8016
+
7995
8017
  networkStats.totalVideoBytesSent = videoBytesSent;
7996
8018
  networkStats.videoBytesSent = videoBytesSent - lastVideoSent;
7997
8019
  networkStats.totalVideoBytesReceived = videoBytesReceived;
@@ -8094,7 +8116,7 @@ var webrtc = {
8094
8116
  }),
8095
8117
  };
8096
8118
 
8097
- const parseCandidate$1 = line => {
8119
+ const parseCandidate = line => {
8098
8120
  let parts;
8099
8121
  // Parse both variants.
8100
8122
  if (line.indexOf('a=candidate:') === 0) {
@@ -8185,7 +8207,7 @@ var SymmetricNat = {
8185
8207
  }
8186
8208
 
8187
8209
  if (e.candidate && e.candidate.candidate.indexOf('srflx') !== -1) {
8188
- const cand = parseCandidate$1(e.candidate.candidate);
8210
+ const cand = parseCandidate(e.candidate.candidate);
8189
8211
  if (!candidates[cand.relatedPort]) candidates[cand.relatedPort] = [];
8190
8212
  candidates[cand.relatedPort].push(cand.port);
8191
8213
  } else if (!e.candidate) {
@@ -8253,7 +8275,7 @@ var iceIpv4 = {
8253
8275
  const rawCandidate = e.candidate.candidate;
8254
8276
  if (rawCandidate.indexOf('srflx') !== -1 || rawCandidate.indexOf('relay') !== -1) {
8255
8277
  hasSrflxOrRelay = true;
8256
- const candidate = parseCandidate$1(e.candidate.candidate);
8278
+ const candidate = parseCandidate(e.candidate.candidate);
8257
8279
  ips.push(candidate.ip);
8258
8280
  }
8259
8281
  } else if (!e.candidate) {