@wazo/sdk 0.37.24 → 0.37.25

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 (94) hide show
  1. package/dist/wazo-sdk.js +6 -6
  2. package/esm/__tests__/api-client.test.js +12 -12
  3. package/esm/__tests__/web-rtc-client.test.js +120 -103
  4. package/esm/api/amid.js +1 -1
  5. package/esm/api/call-logd.js +2 -2
  6. package/esm/api/ctid-ng.js +3 -3
  7. package/esm/api/dird.js +1 -1
  8. package/esm/api/webhookd.js +1 -1
  9. package/esm/api-client.js +12 -12
  10. package/esm/checker/Checker.js +145 -128
  11. package/esm/checker/checks/aor.js +12 -12
  12. package/esm/checker/checks/api.js +12 -12
  13. package/esm/checker/checks/index.js +135 -118
  14. package/esm/checker/checks/wazo-websocket.js +15 -15
  15. package/esm/checker/checks/webrtc-transport.js +120 -103
  16. package/esm/checker/checks/webrtc.js +120 -103
  17. package/esm/domain/AdHocAPIConference.js +12 -12
  18. package/esm/domain/CallLog.js +1 -1
  19. package/esm/domain/Contact.js +1 -1
  20. package/esm/domain/Features.js +12 -12
  21. package/esm/domain/Phone/CTIPhone.js +26 -26
  22. package/esm/domain/Phone/WebRTCPhone.js +87 -86
  23. package/esm/domain/__tests__/CallLog.test.js +1 -1
  24. package/esm/domain/__tests__/Contact.test.js +1 -1
  25. package/esm/index.js +356 -338
  26. package/esm/lib/WazoSessionDescriptionHandler.js +1 -1
  27. package/esm/service/CallApi.js +12 -12
  28. package/esm/service/IssueReporter.js +1 -1
  29. package/esm/service/__tests__/IssueReporter.test.js +1 -1
  30. package/esm/service/getApiClient.js +12 -12
  31. package/esm/simple/Auth.js +346 -328
  32. package/esm/simple/Configuration.js +346 -328
  33. package/esm/simple/Directory.js +12 -12
  34. package/esm/simple/Phone.js +346 -328
  35. package/esm/simple/Websocket.js +17 -17
  36. package/esm/simple/index.js +350 -332
  37. package/esm/simple/room/LocalParticipant.js +350 -332
  38. package/esm/simple/room/Participant.js +350 -332
  39. package/esm/simple/room/RemoteParticipant.js +350 -332
  40. package/esm/simple/room/Room.js +351 -333
  41. package/esm/simple/room/SipRoom.js +350 -332
  42. package/esm/simple/room/Stream.js +350 -332
  43. package/esm/simple/room/__tests__/RemoteParticipant.test.js +350 -332
  44. package/esm/simple/utils.js +350 -332
  45. package/esm/web-rtc-client.js +120 -103
  46. package/esm/websocket-client.js +15 -15
  47. package/lib/__tests__/api-client.test.js +12 -12
  48. package/lib/__tests__/web-rtc-client.test.js +120 -103
  49. package/lib/api/amid.js +1 -1
  50. package/lib/api/call-logd.js +2 -2
  51. package/lib/api/ctid-ng.js +3 -3
  52. package/lib/api/dird.js +1 -1
  53. package/lib/api/webhookd.js +1 -1
  54. package/lib/api-client.js +12 -12
  55. package/lib/checker/Checker.js +145 -128
  56. package/lib/checker/checks/aor.js +12 -12
  57. package/lib/checker/checks/api.js +12 -12
  58. package/lib/checker/checks/index.js +135 -118
  59. package/lib/checker/checks/wazo-websocket.js +15 -15
  60. package/lib/checker/checks/webrtc-transport.js +120 -103
  61. package/lib/checker/checks/webrtc.js +120 -103
  62. package/lib/domain/AdHocAPIConference.js +12 -12
  63. package/lib/domain/CallLog.js +1 -1
  64. package/lib/domain/Contact.js +1 -1
  65. package/lib/domain/Features.js +12 -12
  66. package/lib/domain/Phone/CTIPhone.js +26 -26
  67. package/lib/domain/Phone/WebRTCPhone.js +87 -86
  68. package/lib/domain/__tests__/CallLog.test.js +1 -1
  69. package/lib/domain/__tests__/Contact.test.js +1 -1
  70. package/lib/index.js +356 -338
  71. package/lib/lib/WazoSessionDescriptionHandler.js +1 -1
  72. package/lib/service/CallApi.js +12 -12
  73. package/lib/service/IssueReporter.js +1 -1
  74. package/lib/service/__tests__/IssueReporter.test.js +1 -1
  75. package/lib/service/getApiClient.js +12 -12
  76. package/lib/simple/Auth.js +346 -328
  77. package/lib/simple/Configuration.js +346 -328
  78. package/lib/simple/Directory.js +12 -12
  79. package/lib/simple/Phone.js +346 -328
  80. package/lib/simple/Websocket.js +17 -17
  81. package/lib/simple/index.js +350 -332
  82. package/lib/simple/room/LocalParticipant.js +350 -332
  83. package/lib/simple/room/Participant.js +350 -332
  84. package/lib/simple/room/RemoteParticipant.js +350 -332
  85. package/lib/simple/room/Room.js +351 -333
  86. package/lib/simple/room/SipRoom.js +350 -332
  87. package/lib/simple/room/Stream.js +350 -332
  88. package/lib/simple/room/__tests__/RemoteParticipant.test.js +350 -332
  89. package/lib/simple/utils.js +350 -332
  90. package/lib/web-rtc-client.js +120 -103
  91. package/lib/websocket-client.js +15 -15
  92. package/package.json +1 -1
  93. package/src/domain/Phone/WebRTCPhone.js +3 -2
  94. package/src/web-rtc-client.js +27 -10
@@ -468,7 +468,7 @@ 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 = () => {
@@ -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();
@@ -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
  }
@@ -5531,7 +5531,7 @@ class WazoSessionDescriptionHandler extends sessionDescriptionHandler.SessionDes
5531
5531
  this.peerConnectionDelegate.onicecandidate = event => {
5532
5532
  wazoLogger.trace('onicecandidate', event.candidate ? event.candidate.candidate : { done: true });
5533
5533
  if (event.candidate) {
5534
- this.gatheredCandidates.push(parseCandidate(event.candidate.candidate));
5534
+ this.gatheredCandidates.push(parseCandidate$1(event.candidate.candidate));
5535
5535
  }
5536
5536
  };
5537
5537
 
@@ -5900,7 +5900,7 @@ const DEFAULT_ICE_TIMEOUT = 3000;
5900
5900
  const SEND_STATS_DELAY = 5000;
5901
5901
 
5902
5902
  const states = ['STATUS_NULL', 'STATUS_NEW', 'STATUS_CONNECTING', 'STATUS_CONNECTED', 'STATUS_COMPLETED'];
5903
- const logger$4 = IssueReporter$1 ? IssueReporter$1.loggerFor('webrtc-client') : console;
5903
+ const logger = IssueReporter$1 ? IssueReporter$1.loggerFor('webrtc-client') : console;
5904
5904
  const statsLogger = IssueReporter$1 ? IssueReporter$1.loggerFor('webrtc-stats') : console;
5905
5905
 
5906
5906
  // events
@@ -6076,13 +6076,13 @@ class WebRTCClient extends Emitter {
6076
6076
 
6077
6077
  createUserAgent(configOverrides ) {
6078
6078
  const webRTCConfiguration = this._createWebRTCConfiguration(configOverrides);
6079
- logger$4.info('sdk webrtc, creating UA', { webRTCConfiguration });
6079
+ logger.info('sdk webrtc, creating UA', { webRTCConfiguration });
6080
6080
 
6081
6081
  webRTCConfiguration.delegate = {
6082
6082
  onConnect: this.onConnect.bind(this),
6083
6083
  onDisconnect: this.onDisconnect.bind(this),
6084
6084
  onInvite: (invitation ) => {
6085
- logger$4.info('sdk webrtc on invite', {
6085
+ logger.info('sdk webrtc on invite', {
6086
6086
  method: 'delegate.onInvite',
6087
6087
  id: invitation.id,
6088
6088
  remoteURI: invitation.remoteURI,
@@ -6125,7 +6125,7 @@ class WebRTCClient extends Emitter {
6125
6125
  }
6126
6126
 
6127
6127
  onConnect() {
6128
- logger$4.info('sdk webrtc connected', { method: 'delegate.onConnect' });
6128
+ logger.info('sdk webrtc connected', { method: 'delegate.onConnect' });
6129
6129
  this.eventEmitter.emit(CONNECTED);
6130
6130
  if (!this.isRegistered() && this.registerer && this.registerer.waiting) {
6131
6131
  this.registerer.waitingToggle(false);
@@ -6134,7 +6134,7 @@ class WebRTCClient extends Emitter {
6134
6134
  }
6135
6135
 
6136
6136
  async onDisconnect(error ) {
6137
- logger$4.info('sdk webrtc disconnected', { method: 'delegate.onConnect', error });
6137
+ logger.info('sdk webrtc disconnected', { method: 'delegate.onConnect', error });
6138
6138
  this.connectionPromise = null;
6139
6139
  // The UA will attempt to reconnect automatically when an error occurred
6140
6140
  this.eventEmitter.emit(DISCONNECTED, error);
@@ -6159,37 +6159,37 @@ class WebRTCClient extends Emitter {
6159
6159
  };
6160
6160
 
6161
6161
  if (this.skipRegister) {
6162
- logger$4.info('sdk webrtc skip register...', logInfo);
6162
+ logger.info('sdk webrtc skip register...', logInfo);
6163
6163
  return Promise.resolve();
6164
6164
  }
6165
6165
 
6166
- logger$4.info('sdk webrtc registering...', logInfo);
6166
+ logger.info('sdk webrtc registering...', logInfo);
6167
6167
 
6168
6168
  if (!this.userAgent) {
6169
- logger$4.info('sdk webrtc recreating User Agent');
6169
+ logger.info('sdk webrtc recreating User Agent');
6170
6170
  this.userAgent = this.createUserAgent(this.uaConfigOverrides);
6171
6171
  }
6172
6172
  if (!this.userAgent || this.isRegistered()) {
6173
- logger$4.info('sdk webrtc registering aborted, already registered or no UA can be created');
6173
+ logger.info('sdk webrtc registering aborted, already registered or no UA can be created');
6174
6174
  return Promise.resolve();
6175
6175
  }
6176
6176
 
6177
6177
  if (this.connectionPromise || (this.registerer && this.registerer.waiting)) {
6178
- logger$4.info('sdk webrtc registering aborted due to a registration in progress.');
6178
+ logger.info('sdk webrtc registering aborted due to a registration in progress.');
6179
6179
  return Promise.resolve();
6180
6180
  }
6181
6181
 
6182
6182
  const registerOptions = this._isWeb() ? {} : { extraContactHeaderParams: ['mobility=mobile'] };
6183
6183
 
6184
6184
  const onRegisterFailed = () => {
6185
- logger$4.info('sdk webrtc registering failed', { tries, registerer: !!this.registerer });
6185
+ logger.info('sdk webrtc registering failed', { tries, registerer: !!this.registerer });
6186
6186
  this.connectionPromise = null;
6187
6187
  if (this.registerer && this.registerer.waiting) {
6188
6188
  this.registerer.waitingToggle(false);
6189
6189
  }
6190
6190
 
6191
6191
  if (tries <= MAX_REGISTER_TRIES) {
6192
- logger$4.info('sdk webrtc registering, retrying...', { tries });
6192
+ logger.info('sdk webrtc registering, retrying...', { tries });
6193
6193
  setTimeout(() => this.register(tries + 1), 300);
6194
6194
  }
6195
6195
  };
@@ -6198,18 +6198,18 @@ class WebRTCClient extends Emitter {
6198
6198
  // Avoid race condition with the close method called just before register and setting userAgent to null
6199
6199
  // during the resolution of the primise.
6200
6200
  if (!this.userAgent) {
6201
- logger$4.info('sdk webrtc recreating User Agent after connection');
6201
+ logger.info('sdk webrtc recreating User Agent after connection');
6202
6202
  this.userAgent = this.createUserAgent(this.uaConfigOverrides);
6203
6203
  }
6204
6204
 
6205
- logger$4.info('sdk webrtc registering, transport connected', { registerOptions, ua: !!this.userAgent });
6205
+ logger.info('sdk webrtc registering, transport connected', { registerOptions, ua: !!this.userAgent });
6206
6206
  this.registerer = new registerer.Registerer(this.userAgent, registerOptions);
6207
6207
  this.connectionPromise = null;
6208
6208
  this._monkeyPatchRegisterer(this.registerer);
6209
6209
 
6210
6210
  // Bind registerer events
6211
6211
  this.registerer.stateChange.addListener(newState => {
6212
- logger$4.info('sdk webrtc registering, state changed', { newState });
6212
+ logger.info('sdk webrtc registering, state changed', { newState });
6213
6213
 
6214
6214
  if (newState === registererState.RegistererState.Registered && this.registerer
6215
6215
  && this.registerer.state === registererState.RegistererState.Registered) {
@@ -6222,7 +6222,7 @@ class WebRTCClient extends Emitter {
6222
6222
  const options = {
6223
6223
  requestDelegate: {
6224
6224
  onReject: response => {
6225
- logger$4.error('sdk webrtc registering, rejected', { response });
6225
+ logger.error('sdk webrtc registering, rejected', { response });
6226
6226
 
6227
6227
  onRegisterFailed();
6228
6228
  },
@@ -6230,13 +6230,13 @@ class WebRTCClient extends Emitter {
6230
6230
  };
6231
6231
 
6232
6232
  return this.registerer.register(options).catch((e) => {
6233
- logger$4.error('sdk webrtc registering, error', e);
6233
+ logger.error('sdk webrtc registering, error', e);
6234
6234
 
6235
6235
  this.eventEmitter.emit(REGISTRATION_FAILED);
6236
6236
  return e;
6237
6237
  });
6238
6238
  }).catch(error => {
6239
- logger$4.error('sdk webrtc registering, transport error', error);
6239
+ logger.error('sdk webrtc registering, transport error', error);
6240
6240
  onRegisterFailed();
6241
6241
  });
6242
6242
  }
@@ -6265,21 +6265,21 @@ class WebRTCClient extends Emitter {
6265
6265
  }
6266
6266
 
6267
6267
  unregister() {
6268
- logger$4.info('sdk webrtc unregistering..', { userAgent: !!this.userAgent, registerer: !!this.registerer });
6268
+ logger.info('sdk webrtc unregistering..', { userAgent: !!this.userAgent, registerer: !!this.registerer });
6269
6269
  if (!this.registerer) {
6270
6270
  return Promise.resolve();
6271
6271
  }
6272
6272
 
6273
6273
  try {
6274
6274
  return this.registerer.unregister().then(() => {
6275
- logger$4.info('sdk webrtc unregistered');
6275
+ logger.info('sdk webrtc unregistered');
6276
6276
  this._cleanupRegister();
6277
6277
  }).catch(e => {
6278
- logger$4.error('sdk webrtc unregistering, promise error', e);
6278
+ logger.error('sdk webrtc unregistering, promise error', e);
6279
6279
  this._cleanupRegister();
6280
6280
  });
6281
6281
  } catch (e) {
6282
- logger$4.error('sdk webrtc unregistering, error', e);
6282
+ logger.error('sdk webrtc unregistering, error', e);
6283
6283
  // Avoid issue with `undefined is not an object (evaluating 'new.target.prototype')` when triggering a new
6284
6284
  // error when the registerer is in a bad state
6285
6285
  this._cleanupRegister();
@@ -6287,7 +6287,7 @@ class WebRTCClient extends Emitter {
6287
6287
  }
6288
6288
 
6289
6289
  stop() {
6290
- logger$4.info('sdk webrtc stop', { userAgent: !!this.userAgent });
6290
+ logger.info('sdk webrtc stop', { userAgent: !!this.userAgent });
6291
6291
  if (!this.userAgent) {
6292
6292
  return Promise.resolve();
6293
6293
  }
@@ -6295,12 +6295,12 @@ class WebRTCClient extends Emitter {
6295
6295
  return this.userAgent.stop().then(() => {
6296
6296
  return this._cleanupRegister();
6297
6297
  }).catch(e => {
6298
- logger$4.warn('sdk webrtc stop, error', { message: e.message, stack: e.stack });
6298
+ logger.warn('sdk webrtc stop, error', { message: e.message, stack: e.stack });
6299
6299
  });
6300
6300
  }
6301
6301
 
6302
6302
  call(number , enableVideo , audioOnly = false, conference = false) {
6303
- logger$4.info('sdk webrtc creating call', { number, enableVideo, audioOnly });
6303
+ logger.info('sdk webrtc creating call', { number, enableVideo, audioOnly, conference });
6304
6304
  const inviterOptions = {
6305
6305
  sessionDescriptionHandlerOptionsReInvite: {
6306
6306
  conference,
@@ -6331,7 +6331,7 @@ class WebRTCClient extends Emitter {
6331
6331
  this._onAccepted(session, response.session, true);
6332
6332
  },
6333
6333
  onReject: (response ) => {
6334
- logger$4.info('on call rejected', { id: session.id, fromTag: session.fromTag });
6334
+ logger.info('on call rejected', { id: session.id, fromTag: session.fromTag });
6335
6335
  this._stopSendingStats(session);
6336
6336
  this.stopNetworkMonitoring(session);
6337
6337
 
@@ -6354,11 +6354,11 @@ class WebRTCClient extends Emitter {
6354
6354
  }
6355
6355
 
6356
6356
  answer(session , enableVideo ) {
6357
- logger$4.info('sdk webrtc answer call', { id: session.id, enableVideo });
6357
+ logger.info('sdk webrtc answer call', { id: session.id, enableVideo });
6358
6358
 
6359
6359
  if (!session || !session.accept) {
6360
6360
  const error = 'No session to answer, or not an invitation';
6361
- logger$4.warn(error);
6361
+ logger.warn(error);
6362
6362
  return Promise.reject(new Error(error));
6363
6363
  }
6364
6364
  const options = {
@@ -6368,15 +6368,15 @@ class WebRTCClient extends Emitter {
6368
6368
  return session.accept(options).then(() => {
6369
6369
  if (session.isCanceled) {
6370
6370
  const message = 'accepted a canceled session (or was canceled during the accept phase).';
6371
- logger$4.error(message, { id: session.id });
6371
+ logger.error(message, { id: session.id });
6372
6372
  this.onCallEnded(session);
6373
6373
 
6374
6374
  throw new CanceledCallError(message);
6375
6375
  }
6376
- logger$4.info('sdk webrtc answer, accepted.');
6376
+ logger.info('sdk webrtc answer, accepted.');
6377
6377
  this._onAccepted(session);
6378
6378
  }).catch(e => {
6379
- logger$4.error(`answer call error for ${session ? session.id : 'n/a'}`, e);
6379
+ logger.error(`answer call error for ${session ? session.id : 'n/a'}`, e);
6380
6380
 
6381
6381
  throw e;
6382
6382
  });
@@ -6384,7 +6384,7 @@ class WebRTCClient extends Emitter {
6384
6384
 
6385
6385
  hangup(session ) {
6386
6386
  const { state, id } = session;
6387
- logger$4.info('sdk webrtc hangup call', { id, state });
6387
+ logger.info('sdk webrtc hangup call', { id, state });
6388
6388
 
6389
6389
  try {
6390
6390
  this._stopSendingStats(session);
@@ -6413,7 +6413,7 @@ class WebRTCClient extends Emitter {
6413
6413
 
6414
6414
  return bye();
6415
6415
  } catch (error) {
6416
- logger$4.warn('sdk webrtc hangup, error', error);
6416
+ logger.warn('sdk webrtc hangup, error', error);
6417
6417
  }
6418
6418
 
6419
6419
  return null;
@@ -6431,7 +6431,7 @@ class WebRTCClient extends Emitter {
6431
6431
  // Fetch and emit an event at `interval` with session network stats
6432
6432
  startNetworkMonitoring(session , interval = 1000) {
6433
6433
  const sessionId = this.getSipSessionId(session);
6434
- logger$4.info('starting network inspection', { id: sessionId });
6434
+ logger.info('starting network inspection', { id: sessionId });
6435
6435
 
6436
6436
  this.sessionNetworkStats[sessionId] = [];
6437
6437
 
@@ -6441,7 +6441,7 @@ class WebRTCClient extends Emitter {
6441
6441
  stopNetworkMonitoring(session ) {
6442
6442
  const sessionId = this.getSipSessionId(session);
6443
6443
  const exists = sessionId in this.networkMonitoringInterval;
6444
- logger$4.info('stopping network inspection', { id: sessionId, exists });
6444
+ logger.info('stopping network inspection', { id: sessionId, exists });
6445
6445
 
6446
6446
  if (exists) {
6447
6447
  clearInterval(this.networkMonitoringInterval[sessionId]);
@@ -6451,17 +6451,17 @@ class WebRTCClient extends Emitter {
6451
6451
  }
6452
6452
 
6453
6453
  reject(session ) {
6454
- logger$4.info('sdk webrtc reject call', { id: session.id });
6454
+ logger.info('sdk webrtc reject call', { id: session.id });
6455
6455
 
6456
6456
  try {
6457
6457
  return session.reject ? session.reject() : session.cancel();
6458
6458
  } catch (e) {
6459
- logger$4.warn('Error when rejecting call', e.message, e.stack);
6459
+ logger.warn('Error when rejecting call', e.message, e.stack);
6460
6460
  }
6461
6461
  }
6462
6462
 
6463
6463
  async close() {
6464
- logger$4.info('sdk webrtc closing client', { userAgent: !!this.userAgent });
6464
+ logger.info('sdk webrtc closing client', { userAgent: !!this.userAgent });
6465
6465
  this._cleanupMedia();
6466
6466
  this.connectionPromise = null;
6467
6467
 
@@ -6492,7 +6492,7 @@ class WebRTCClient extends Emitter {
6492
6492
  // eg: "INVITE not rejectable in state Completed"
6493
6493
  }
6494
6494
  this.userAgent = null;
6495
- logger$4.info('sdk webrtc client closed');
6495
+ logger.info('sdk webrtc client closed');
6496
6496
  }
6497
6497
 
6498
6498
  getNumber(session ) {
@@ -6505,13 +6505,13 @@ class WebRTCClient extends Emitter {
6505
6505
  }
6506
6506
 
6507
6507
  mute(session ) {
6508
- logger$4.info('sdk webrtc mute', { id: session.id });
6508
+ logger.info('sdk webrtc mute', { id: session.id });
6509
6509
 
6510
6510
  this._toggleAudio(session, true);
6511
6511
  }
6512
6512
 
6513
6513
  unmute(session ) {
6514
- logger$4.info('sdk webrtc unmute', { id: session.id });
6514
+ logger.info('sdk webrtc unmute', { id: session.id });
6515
6515
 
6516
6516
  this._toggleAudio(session, false);
6517
6517
  }
@@ -6551,13 +6551,13 @@ class WebRTCClient extends Emitter {
6551
6551
  }
6552
6552
 
6553
6553
  toggleCameraOn(session ) {
6554
- logger$4.info('sdk webrtc toggle camera on', { id: session.id });
6554
+ logger.info('sdk webrtc toggle camera on', { id: session.id });
6555
6555
 
6556
6556
  this._toggleVideo(session, false);
6557
6557
  }
6558
6558
 
6559
6559
  toggleCameraOff(session ) {
6560
- logger$4.info('sdk webrtc toggle camera off', { id: session.id });
6560
+ logger.info('sdk webrtc toggle camera off', { id: session.id });
6561
6561
 
6562
6562
  this._toggleVideo(session, true);
6563
6563
  }
@@ -6566,7 +6566,7 @@ class WebRTCClient extends Emitter {
6566
6566
  const sessionId = this.getSipSessionId(session);
6567
6567
  const hasVideo = hadVideo || this.hasLocalVideo(sessionId);
6568
6568
 
6569
- logger$4.info('sdk webrtc hold', {
6569
+ logger.info('sdk webrtc hold', {
6570
6570
  sessionId,
6571
6571
  keys: Object.keys(this.heldSessions),
6572
6572
  pendingReinvite: !!session.pendingReinvite,
@@ -6615,7 +6615,7 @@ class WebRTCClient extends Emitter {
6615
6615
  const sessionId = this.getSipSessionId(session);
6616
6616
  const hasVideo = sessionId in this.heldSessions && this.heldSessions[sessionId].hasVideo;
6617
6617
 
6618
- logger$4.info('sdk webrtc unhold', {
6618
+ logger.info('sdk webrtc unhold', {
6619
6619
  sessionId,
6620
6620
  keys: Object.keys(this.heldSessions),
6621
6621
  pendingReinvite: !!session.pendingReinvite,
@@ -6763,7 +6763,7 @@ class WebRTCClient extends Emitter {
6763
6763
  if (!session.sessionDescriptionHandler) {
6764
6764
  return;
6765
6765
  }
6766
- logger$4.info('Sending DTMF', {
6766
+ logger.info('Sending DTMF', {
6767
6767
  id: this.getSipSessionId(session),
6768
6768
  tone,
6769
6769
  });
@@ -6779,7 +6779,7 @@ class WebRTCClient extends Emitter {
6779
6779
  transfer(session , target ) {
6780
6780
  this.hold(session);
6781
6781
 
6782
- logger$4.info('Transfering a session', {
6782
+ logger.info('Transfering a session', {
6783
6783
  id: this.getSipSessionId(session),
6784
6784
  target,
6785
6785
  });
@@ -6801,17 +6801,17 @@ class WebRTCClient extends Emitter {
6801
6801
  atxfer(session ) {
6802
6802
  this.hold(session);
6803
6803
 
6804
- logger$4.info('webrtc transfer started', { id: this.getSipSessionId(session) });
6804
+ logger.info('webrtc transfer started', { id: this.getSipSessionId(session) });
6805
6805
 
6806
6806
  const result = {
6807
6807
  newSession: null,
6808
6808
  init: async (target ) => {
6809
- logger$4.info('webrtc transfer initialized', { id: this.getSipSessionId(session), target });
6809
+ logger.info('webrtc transfer initialized', { id: this.getSipSessionId(session), target });
6810
6810
 
6811
6811
  result.newSession = await this.call(target);
6812
6812
  },
6813
6813
  complete: () => {
6814
- logger$4.info('webrtc transfer completed', {
6814
+ logger.info('webrtc transfer completed', {
6815
6815
  id: this.getSipSessionId(session),
6816
6816
  referId: this.getSipSessionId(result.newSession),
6817
6817
  });
@@ -6832,7 +6832,7 @@ class WebRTCClient extends Emitter {
6832
6832
  return;
6833
6833
  }
6834
6834
 
6835
- logger$4.info('send WebRTC message', { sipId: sipSession.id, contentType });
6835
+ logger.info('send WebRTC message', { sipId: sipSession.id, contentType });
6836
6836
 
6837
6837
  try {
6838
6838
  sipSession.message({
@@ -6874,7 +6874,7 @@ class WebRTCClient extends Emitter {
6874
6874
  }
6875
6875
 
6876
6876
  changeAudioOutputVolume(volume ) {
6877
- logger$4.info('Changing audio output volume', { volume });
6877
+ logger.info('Changing audio output volume', { volume });
6878
6878
 
6879
6879
  Object.values(this.audioElements).forEach(audioElement => {
6880
6880
  if (audioElement instanceof HTMLAudioElement) {
@@ -6886,7 +6886,7 @@ class WebRTCClient extends Emitter {
6886
6886
  }
6887
6887
 
6888
6888
  changeAudioOutputDevice(id ) {
6889
- logger$4.info('Changing audio output device', { id });
6889
+ logger.info('Changing audio output device', { id });
6890
6890
 
6891
6891
  Object.values(this.audioElements).forEach(audioElement => {
6892
6892
  // `setSinkId` method is not included in any flow type definitions for HTMLAudioElements but is a valid method
@@ -6903,7 +6903,7 @@ class WebRTCClient extends Emitter {
6903
6903
 
6904
6904
  changeAudioInputDevice(id , session ) {
6905
6905
  const currentId = this.getAudioDeviceId();
6906
- logger$4.info('setting audio input device', { id, currentId, session: !!session });
6906
+ logger.info('setting audio input device', { id, currentId, session: !!session });
6907
6907
 
6908
6908
  if (id === currentId) {
6909
6909
  return null;
@@ -6949,7 +6949,7 @@ class WebRTCClient extends Emitter {
6949
6949
 
6950
6950
  setVideoInputDevice(id ) {
6951
6951
  const currentId = this.getVideoDeviceId();
6952
- logger$4.info('setting video input device', { id, currentId });
6952
+ logger.info('setting video input device', { id, currentId });
6953
6953
 
6954
6954
  if (id === currentId) {
6955
6955
  return null;
@@ -6974,7 +6974,7 @@ class WebRTCClient extends Emitter {
6974
6974
  const sessionId = this.getSipSessionId(session);
6975
6975
  const localStream = this.getLocalStream(sessionId);
6976
6976
 
6977
- logger$4.info('changing video input device', { id, sessionId });
6977
+ logger.info('changing video input device', { id, sessionId });
6978
6978
 
6979
6979
  // Release old video stream
6980
6980
  if (localStream) {
@@ -7042,7 +7042,7 @@ class WebRTCClient extends Emitter {
7042
7042
  const shouldDoScreenSharing = newConstraints && newConstraints.screen;
7043
7043
  const desktop = newConstraints && newConstraints.desktop;
7044
7044
 
7045
- logger$4.info('Sending reinvite', {
7045
+ logger.info('Sending reinvite', {
7046
7046
  id: this.getSipSessionId(sipSession),
7047
7047
  newConstraints,
7048
7048
  conference,
@@ -7080,7 +7080,7 @@ class WebRTCClient extends Emitter {
7080
7080
  sipSession.incomingInviteRequest.message.body = response.message.body;
7081
7081
  }
7082
7082
 
7083
- logger$4.info('on re-INVITE accepted', {
7083
+ logger.info('on re-INVITE accepted', {
7084
7084
  id: this.getSipSessionId(sipSession),
7085
7085
  wasMuted,
7086
7086
  shouldDoScreenSharing,
@@ -7255,7 +7255,7 @@ class WebRTCClient extends Emitter {
7255
7255
  }
7256
7256
 
7257
7257
  startHeartbeat() {
7258
- logger$4.info('sdk webrtc start heartbeat', { userAgent: !!this.userAgent });
7258
+ logger.info('sdk webrtc start heartbeat', { userAgent: !!this.userAgent });
7259
7259
  if (!this.userAgent) {
7260
7260
  this.heartbeat.stop();
7261
7261
  return;
@@ -7268,7 +7268,7 @@ class WebRTCClient extends Emitter {
7268
7268
  }
7269
7269
 
7270
7270
  stopHeartbeat() {
7271
- logger$4.info('sdk webrtc stop heartbeat');
7271
+ logger.info('sdk webrtc stop heartbeat');
7272
7272
  this.heartbeat.stop();
7273
7273
  }
7274
7274
 
@@ -7289,7 +7289,7 @@ class WebRTCClient extends Emitter {
7289
7289
  }
7290
7290
 
7291
7291
  attemptReconnection() {
7292
- logger$4.info('attempt reconnection', { userAgent: !!this.userAgent });
7292
+ logger.info('attempt reconnection', { userAgent: !!this.userAgent });
7293
7293
  if (!this.userAgent) {
7294
7294
  return;
7295
7295
  }
@@ -7314,7 +7314,7 @@ class WebRTCClient extends Emitter {
7314
7314
  return;
7315
7315
  }
7316
7316
 
7317
- logger$4.info('setting local media stream', {
7317
+ logger.info('setting local media stream', {
7318
7318
  sipSessionId,
7319
7319
  tracks: newStream ? newStream.getTracks() : null,
7320
7320
  });
@@ -7331,7 +7331,7 @@ class WebRTCClient extends Emitter {
7331
7331
 
7332
7332
  const oldStream = this.getLocalStream(sipSessionId);
7333
7333
 
7334
- logger$4.info('updating local stream', {
7334
+ logger.info('updating local stream', {
7335
7335
  sipSessionId,
7336
7336
  oldStream: !!oldStream,
7337
7337
  tracks: newStream.getTracks(),
@@ -7351,7 +7351,7 @@ class WebRTCClient extends Emitter {
7351
7351
  const remoteStream = this.getRemoteStream(sessionId);
7352
7352
  const pc = this.getPeerConnection(sessionId);
7353
7353
 
7354
- logger$4.info('Updating remote stream', {
7354
+ logger.info('Updating remote stream', {
7355
7355
  sessionId,
7356
7356
  tracks: remoteStream ? remoteStream.getTracks() : null,
7357
7357
  receiverTracks: pc && pc.getReceivers ? pc.getReceivers().map(receiver => receiver.track) : null,
@@ -7376,14 +7376,16 @@ class WebRTCClient extends Emitter {
7376
7376
  const screenSharing = constraints && 'screen' in constraints ? constraints.screen : false;
7377
7377
  const isDesktop = constraints && 'desktop' in constraints ? constraints.desktop : false;
7378
7378
  const withAudio = constraints && 'audio' in constraints ? constraints.audio : true;
7379
+ const mandatoryVideo = constraints && typeof constraints.video === 'object' ? constraints.video.mandatory : {};
7379
7380
 
7380
- logger$4.info('Retrieving media a configuration', { enableVideo, screenSharing, isDesktop, withAudio, constraints });
7381
+ logger.info('Retrieving media a configuration', { enableVideo, screenSharing, isDesktop, withAudio, constraints });
7381
7382
 
7382
7383
  return {
7383
7384
  constraints: {
7384
7385
  // Exact constraint are not supported with `getDisplayMedia` and we must have a video=false in desktop screenshare
7385
7386
  audio: screenSharing ? !isDesktop : (withAudio ? this._getAudioConstraints() : false),
7386
- video: screenSharing ? (isDesktop ? ({ mandatory: { chromeMediaSource: 'desktop' } }) : { cursor: 'always' })
7387
+ video: screenSharing ? (isDesktop
7388
+ ? ({ mandatory: { chromeMediaSource: 'desktop', ...(mandatoryVideo || {}) } }) : { cursor: 'always' })
7387
7389
  : this._getVideoConstraints(enableVideo),
7388
7390
  screen: screenSharing,
7389
7391
  desktop: isDesktop,
@@ -7426,7 +7428,7 @@ class WebRTCClient extends Emitter {
7426
7428
  }
7427
7429
 
7428
7430
  _onTransportError() {
7429
- logger$4.error('on transport error');
7431
+ logger.error('on transport error');
7430
7432
  this.eventEmitter.emit(TRANSPORT_ERROR);
7431
7433
  this.attemptReconnection();
7432
7434
  }
@@ -7435,7 +7437,7 @@ class WebRTCClient extends Emitter {
7435
7437
  const body = message && typeof message === 'object' ? message.data : message;
7436
7438
  if (body && body.indexOf('200 OK') !== -1) {
7437
7439
  if (this.hasHeartbeat()) {
7438
- logger$4.info('on heartbeat received from Asterisk', { hasHeartbeat: this.hasHeartbeat() });
7440
+ logger.info('on heartbeat received from Asterisk', { hasHeartbeat: this.hasHeartbeat() });
7439
7441
 
7440
7442
  this.heartbeat.onHeartbeat();
7441
7443
  if (this.heartbeatCb) {
@@ -7446,7 +7448,7 @@ class WebRTCClient extends Emitter {
7446
7448
  }
7447
7449
 
7448
7450
  async _onHeartbeatTimeout() {
7449
- logger$4.info('sdk webrtc heartbeat timed out', { userAgent: !!this.userAgent, cb: !!this.heartbeatTimeoutCb });
7451
+ logger.info('sdk webrtc heartbeat timed out', { userAgent: !!this.userAgent, cb: !!this.heartbeatTimeoutCb });
7450
7452
 
7451
7453
  if (this.heartbeatTimeoutCb) {
7452
7454
  this.heartbeatTimeoutCb();
@@ -7458,7 +7460,7 @@ class WebRTCClient extends Emitter {
7458
7460
  try {
7459
7461
  await this.userAgent.transport.disconnect();
7460
7462
  } catch (e) {
7461
- logger$4.error('Transport disconnection after heartbeat timeout, error', e);
7463
+ logger.error('Transport disconnection after heartbeat timeout, error', e);
7462
7464
  }
7463
7465
  }
7464
7466
 
@@ -7491,31 +7493,31 @@ class WebRTCClient extends Emitter {
7491
7493
  }
7492
7494
 
7493
7495
  _connectIfNeeded() {
7494
- logger$4.info('connect if needed, checking', { connected: this.isConnected() });
7496
+ logger.info('connect if needed, checking', { connected: this.isConnected() });
7495
7497
  if (!this.userAgent) {
7496
- logger$4.info('need to recreate User Agent');
7498
+ logger.info('need to recreate User Agent');
7497
7499
  this.userAgent = this.createUserAgent(this.uaConfigOverrides);
7498
7500
  }
7499
7501
 
7500
7502
  if (this.isConnected()) {
7501
- logger$4.info('webrtc sdk, already connected');
7503
+ logger.info('webrtc sdk, already connected');
7502
7504
  return Promise.resolve();
7503
7505
  }
7504
7506
 
7505
7507
  if (this.isConnecting()) {
7506
- logger$4.info('webrtc sdk, already connecting...');
7508
+ logger.info('webrtc sdk, already connecting...');
7507
7509
 
7508
7510
  this.connectionPromise = this.userAgent.transport.connectPromise;
7509
7511
  return this.connectionPromise;
7510
7512
  }
7511
7513
 
7512
7514
  if (this.connectionPromise) {
7513
- logger$4.info('webrtc sdk, connection promise connecting...');
7515
+ logger.info('webrtc sdk, connection promise connecting...');
7514
7516
  // $FlowFixMe
7515
7517
  return this.connectionPromise;
7516
7518
  }
7517
7519
 
7518
- logger$4.info('WebRTC UA needs to connect');
7520
+ logger.info('WebRTC UA needs to connect');
7519
7521
 
7520
7522
  // Force UA to reconnect
7521
7523
  if (this.userAgent && this.userAgent.state !== userAgentState.UserAgentState.Stopped) {
@@ -7640,7 +7642,7 @@ class WebRTCClient extends Emitter {
7640
7642
 
7641
7643
  sdh.peerConnectionDelegate = {
7642
7644
  onicecandidateerror: (error ) => {
7643
- logger$4.error('on icecandidate error', {
7645
+ logger.error('on icecandidate error', {
7644
7646
  address: error.address,
7645
7647
  port: error.port,
7646
7648
  errorCode: error.errorCode,
@@ -7669,7 +7671,7 @@ class WebRTCClient extends Emitter {
7669
7671
  updatedNumber = session.assertedIdentity.uri.normal.user;
7670
7672
  updatedCalleeName = session.assertedIdentity.displayName || updatedNumber;
7671
7673
  }
7672
- logger$4.info('re-invite received', { updatedCalleeName, updatedNumber, hadRemoteVideo });
7674
+ logger.info('re-invite received', { updatedCalleeName, updatedNumber, hadRemoteVideo });
7673
7675
 
7674
7676
  // Useful to know if it's a video upgrade or an unhold from a remote peer with a video stream
7675
7677
 
@@ -7690,7 +7692,7 @@ class WebRTCClient extends Emitter {
7690
7692
  }
7691
7693
 
7692
7694
  _onAccepted(session , sessionDialog , withEvent = true) {
7693
- logger$4.info('on call accepted', { id: session.id, remoteTag: session.remoteTag });
7695
+ logger.info('on call accepted', { id: session.id, remoteTag: session.remoteTag });
7694
7696
 
7695
7697
  this.storeSipSession(session);
7696
7698
 
@@ -7702,7 +7704,7 @@ class WebRTCClient extends Emitter {
7702
7704
  const onTrack = (event ) => {
7703
7705
  const isAudioOnly = this._isAudioOnly(session);
7704
7706
  const { kind, label, readyState, id, muted } = event.track;
7705
- logger$4.info('on track event', { isAudioOnly, kind, label, readyState, id, muted });
7707
+ logger.info('on track event', { isAudioOnly, kind, label, readyState, id, muted });
7706
7708
 
7707
7709
  // Stop video track in audio only mode
7708
7710
  if (isAudioOnly && kind === 'video') {
@@ -7718,12 +7720,14 @@ class WebRTCClient extends Emitter {
7718
7720
 
7719
7721
  session.sessionDescriptionHandler.remoteMediaStream.onaddtrack = onTrack;
7720
7722
 
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
- };
7723
+ if (pc) {
7724
+ pc.oniceconnectionstatechange = () => {
7725
+ logger.info('on ice connection state changed', { state: pc.iceConnectionState });
7726
+ if (pc.iceConnectionState === 'disconnected') {
7727
+ this.eventEmitter.emit(ON_DISCONNECTED);
7728
+ }
7729
+ };
7730
+ }
7727
7731
 
7728
7732
  if (withEvent) {
7729
7733
  this.eventEmitter.emit(ACCEPTED, session, sessionDialog);
@@ -7892,10 +7896,10 @@ class WebRTCClient extends Emitter {
7892
7896
 
7893
7897
  _stopSendingStats(session ) {
7894
7898
  const sessionId = this.getSipSessionId(session);
7895
- logger$4.trace('Check for stopping stats', { sessionId, ids: Object.keys(this.statsIntervals) });
7899
+ logger.trace('Check for stopping stats', { sessionId, ids: Object.keys(this.statsIntervals) });
7896
7900
 
7897
7901
  if (sessionId in this.statsIntervals) {
7898
- logger$4.trace('Stop sending stats for call', { sessionId });
7902
+ logger.trace('Stop sending stats for call', { sessionId });
7899
7903
  this.statsIntervals[sessionId]();
7900
7904
  delete this.statsIntervals[sessionId];
7901
7905
  }
@@ -7911,7 +7915,7 @@ class WebRTCClient extends Emitter {
7911
7915
  try {
7912
7916
  await this.userAgent.transport.disconnect();
7913
7917
  } catch (e) {
7914
- logger$4.error('WebRTC transport disconnect, error', e);
7918
+ logger.error('WebRTC transport disconnect, error', e);
7915
7919
  }
7916
7920
  }
7917
7921
  }
@@ -7933,13 +7937,17 @@ class WebRTCClient extends Emitter {
7933
7937
  const nbStats = this.sessionNetworkStats[sessionId].length;
7934
7938
  const lastNetworkStats = this.sessionNetworkStats[sessionId][nbStats - 1];
7935
7939
  const lastAudioSent = lastNetworkStats ? lastNetworkStats.audioBytesSent : 0;
7940
+ const lastAudioContentSent = lastNetworkStats ? lastNetworkStats.audioContentSent : 0;
7936
7941
  const lastVideoSent = lastNetworkStats ? lastNetworkStats.videoBytesSent : 0;
7937
7942
  const lastAudioReceived = lastNetworkStats ? lastNetworkStats.audioBytesReceived : 0;
7943
+ const lastAudioContentReceived = lastNetworkStats ? lastNetworkStats.audioContentReceived : 0;
7938
7944
  const lastVideoReceived = lastNetworkStats ? lastNetworkStats.videoBytesReceived : 0;
7939
7945
  const lastTransportSent = lastNetworkStats ? lastNetworkStats.transportSent : 0;
7940
7946
  const lastTransportReceived = lastNetworkStats ? lastNetworkStats.transportReceived : 0;
7941
- let audioBytesSent = 0;
7942
- let audioBytesReceived = 0;
7947
+ let audioBytesSent = 0; // content + header
7948
+ let audioBytesReceived = 0; // content + header
7949
+ let audioContentSent = 0; // useful to detect blank call
7950
+ let audioContentReceived = 0;
7943
7951
  let videoBytesSent = 0;
7944
7952
  let videoBytesReceived = 0;
7945
7953
  let transportSent = 0;
@@ -7949,6 +7957,7 @@ class WebRTCClient extends Emitter {
7949
7957
  stats.forEach(report => {
7950
7958
  if (report.type === 'outbound-rtp' && report.kind === 'audio') {
7951
7959
  audioBytesSent += Number(report.bytesSent) + Number(report.headerBytesSent);
7960
+ audioContentSent += Number(report.bytesSent);
7952
7961
  }
7953
7962
  if (report.type === 'remote-outbound-rtp' && report.kind === 'audio') {
7954
7963
  audioBytesSent += Number(report.bytesSent);
@@ -7960,6 +7969,7 @@ class WebRTCClient extends Emitter {
7960
7969
  packetsLost += Number(report.packetsLost);
7961
7970
  networkStats.packetsReceived = Number(report.packetsReceived);
7962
7971
  audioBytesReceived += Number(report.bytesReceived) + Number(report.headerBytesReceived);
7972
+ audioContentReceived += Number(report.bytesReceived);
7963
7973
  }
7964
7974
  if (report.type === 'inbound-rtp' && report.kind === 'video') {
7965
7975
  videoBytesReceived += Number(report.bytesReceived) + Number(report.headerBytesReceived);
@@ -7988,10 +7998,17 @@ class WebRTCClient extends Emitter {
7988
7998
  });
7989
7999
 
7990
8000
  networkStats.packetsLost = packetsLost;
8001
+
7991
8002
  networkStats.totalAudioBytesSent = audioBytesSent;
7992
8003
  networkStats.audioBytesSent = audioBytesSent - lastAudioSent;
7993
8004
  networkStats.totalAudioBytesReceived = audioBytesReceived - lastAudioReceived;
7994
8005
  networkStats.audioBytesReceived = audioBytesReceived;
8006
+
8007
+ networkStats.totalAudioContentSent = audioContentSent;
8008
+ networkStats.audioContentSent = audioContentSent - lastAudioContentSent;
8009
+ networkStats.totalAudioBytesReceived = audioContentReceived - lastAudioContentReceived;
8010
+ networkStats.audioContentReceived = audioContentReceived;
8011
+
7995
8012
  networkStats.totalVideoBytesSent = videoBytesSent;
7996
8013
  networkStats.videoBytesSent = videoBytesSent - lastVideoSent;
7997
8014
  networkStats.totalVideoBytesReceived = videoBytesReceived;
@@ -8094,7 +8111,7 @@ var webrtc = {
8094
8111
  }),
8095
8112
  };
8096
8113
 
8097
- const parseCandidate$1 = line => {
8114
+ const parseCandidate = line => {
8098
8115
  let parts;
8099
8116
  // Parse both variants.
8100
8117
  if (line.indexOf('a=candidate:') === 0) {
@@ -8185,7 +8202,7 @@ var SymmetricNat = {
8185
8202
  }
8186
8203
 
8187
8204
  if (e.candidate && e.candidate.candidate.indexOf('srflx') !== -1) {
8188
- const cand = parseCandidate$1(e.candidate.candidate);
8205
+ const cand = parseCandidate(e.candidate.candidate);
8189
8206
  if (!candidates[cand.relatedPort]) candidates[cand.relatedPort] = [];
8190
8207
  candidates[cand.relatedPort].push(cand.port);
8191
8208
  } else if (!e.candidate) {
@@ -8253,7 +8270,7 @@ var iceIpv4 = {
8253
8270
  const rawCandidate = e.candidate.candidate;
8254
8271
  if (rawCandidate.indexOf('srflx') !== -1 || rawCandidate.indexOf('relay') !== -1) {
8255
8272
  hasSrflxOrRelay = true;
8256
- const candidate = parseCandidate$1(e.candidate.candidate);
8273
+ const candidate = parseCandidate(e.candidate.candidate);
8257
8274
  ips.push(candidate.ip);
8258
8275
  }
8259
8276
  } else if (!e.candidate) {