@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
@@ -458,11 +458,11 @@ var IssueReporter$1 = new IssueReporter();
458
458
 
459
459
  const methods = ['head', 'get', 'post', 'put', 'delete'];
460
460
 
461
- const logger = IssueReporter$1 ? IssueReporter$1.loggerFor('api') : console;
461
+ const logger$3 = IssueReporter$1 ? IssueReporter$1.loggerFor('api') : console;
462
462
 
463
463
  // Use a function here to be able to mock it in tests
464
464
  const realFetch = () => {
465
- if (typeof document !== 'undefined') {
465
+ if (typeof document !== 'undefined' && window.fetch) {
466
466
  // Browser
467
467
  return window.fetch;
468
468
  }
@@ -597,7 +597,7 @@ class ApiRequester {
597
597
  };
598
598
 
599
599
  if (this.refreshTokenPromise) {
600
- logger.info('A token is already refreshing, waiting ...', { url });
600
+ logger$3.info('A token is already refreshing, waiting ...', { url });
601
601
  await this.refreshTokenPromise;
602
602
  }
603
603
 
@@ -617,7 +617,7 @@ class ApiRequester {
617
617
  return promise.then(async (err ) => {
618
618
  // Check if the token is still valid
619
619
  if (firstCall && this._checkTokenExpired(response, err)) {
620
- logger.warn('token expired', { error: err.reason });
620
+ logger$3.warn('token expired', { error: err.reason });
621
621
  // Replay the call after refreshing the token
622
622
  return this._replayWithNewToken(err, path, method, body, headers, parse);
623
623
  }
@@ -627,7 +627,7 @@ class ApiRequester {
627
627
  : exceptionClass.fromResponse(err, response.status);
628
628
 
629
629
  if (this.shouldLogErrors) {
630
- logger.error('API error', error);
630
+ logger$3.error('API error', error);
631
631
  }
632
632
 
633
633
  throw error;
@@ -637,7 +637,7 @@ class ApiRequester {
637
637
  return newParse(response, isJson);
638
638
  }).catch(error => {
639
639
  if (this.shouldLogErrors) {
640
- logger.error('Fetch failed', { url, options, message: error.message, stack: error.stack });
640
+ logger$3.error('Fetch failed', { url, options, message: error.message, stack: error.stack });
641
641
  }
642
642
 
643
643
  throw error;
@@ -665,13 +665,13 @@ class ApiRequester {
665
665
  ) {
666
666
  const isTokenNotFound = this._isTokenNotFound(err);
667
667
  let newPath = path;
668
- logger.info('refreshing token', { inProgress: !!this.refreshTokenPromise });
668
+ logger$3.info('refreshing token', { inProgress: !!this.refreshTokenPromise });
669
669
 
670
670
  this.refreshTokenPromise = this.refreshTokenPromise || this.refreshTokenCallback();
671
671
 
672
672
  return this.refreshTokenPromise.then(() => {
673
673
  this.refreshTokenPromise = null;
674
- logger.info('token refreshed', { isTokenNotFound });
674
+ logger$3.info('token refreshed', { isTokenNotFound });
675
675
  if (isTokenNotFound) {
676
676
  const pathParts = path.split('/');
677
677
  pathParts.pop();
@@ -1922,7 +1922,7 @@ class Contact {
1922
1922
  this[key] = old[key] || this[key];
1923
1923
  });
1924
1924
 
1925
- if (old.lineState && !this.lineState) {
1925
+ if (old.lineState) {
1926
1926
  this.lineState = old.lineState;
1927
1927
  }
1928
1928
 
@@ -3639,7 +3639,7 @@ const TRANSFER_FLOW_BLIND = 'blind';
3639
3639
 
3640
3640
  // const MINIMUM_WAZO_ENGINE_VERSION_FOR_CTI_HOLD = '20.11';
3641
3641
 
3642
- const logger$1 = IssueReporter$1 ? IssueReporter$1.loggerFor('cti-phone') : console;
3642
+ IssueReporter$1 ? IssueReporter$1.loggerFor('cti-phone') : console;
3643
3643
 
3644
3644
  /* */
3645
3645
 
@@ -4983,7 +4983,7 @@ const BLACKLIST_EVENTS = [
4983
4983
  ];
4984
4984
 
4985
4985
  const HEARTBEAT_ENGINE_VERSION = '20.09';
4986
- const logger$3 = IssueReporter$1.loggerFor('wazo-ws');
4986
+ const logger$1 = IssueReporter$1.loggerFor('wazo-ws');
4987
4987
  const messageLogger = IssueReporter$1.loggerFor('wazo-ws-message');
4988
4988
 
4989
4989
  class WebSocketClient extends Emitter {
@@ -5032,19 +5032,19 @@ class WebSocketClient extends Emitter {
5032
5032
  }
5033
5033
 
5034
5034
  connect() {
5035
- logger$3.info('connect method started', { host: this.host, token: this.token });
5035
+ logger$1.info('connect method started', { host: this.host, token: this.token });
5036
5036
  this.socket = new ReconnectingWebSocket(this._getUrl.bind(this), [], this.options);
5037
5037
  if (this.options.binaryType) {
5038
5038
  this.socket.binaryType = this.options.binaryType;
5039
5039
  }
5040
5040
 
5041
5041
  this.socket.onopen = () => {
5042
- logger$3.info('on Wazo WS open', { method: 'connect', host: this.host });
5042
+ logger$1.info('on Wazo WS open', { method: 'connect', host: this.host });
5043
5043
  this.eventEmitter.emit(SOCKET_EVENTS.ON_OPEN);
5044
5044
  };
5045
5045
 
5046
5046
  this.socket.onerror = event => {
5047
- logger$3.error('on Wazo WS error', event.target);
5047
+ logger$1.error('on Wazo WS error', event.target);
5048
5048
  this.eventEmitter.emit(SOCKET_EVENTS.ON_ERROR, event);
5049
5049
  };
5050
5050
 
@@ -5074,7 +5074,7 @@ class WebSocketClient extends Emitter {
5074
5074
 
5075
5075
  this.socket.onclose = event => {
5076
5076
  // Can't be converted to JSON (circular structure)
5077
- logger$3.info('on Wazo WS close', {
5077
+ logger$1.info('on Wazo WS close', {
5078
5078
  reason: event.reason,
5079
5079
  code: event.code,
5080
5080
  readyState: event.target.readyState,
@@ -5092,12 +5092,12 @@ class WebSocketClient extends Emitter {
5092
5092
  };
5093
5093
 
5094
5094
  this.socket.onerror = event => {
5095
- logger$3.info('Wazo WS error', { message: event.message, code: event.code, readyState: event.target.readyState });
5095
+ logger$1.info('Wazo WS error', { message: event.message, code: event.code, readyState: event.target.readyState });
5096
5096
  };
5097
5097
  }
5098
5098
 
5099
5099
  close(force = false) {
5100
- logger$3.info('Wazo WS close', { socket: !!this.socket, host: this.host, token: this.token });
5100
+ logger$1.info('Wazo WS close', { socket: !!this.socket, host: this.host, token: this.token });
5101
5101
 
5102
5102
  if (!this.socket) {
5103
5103
  return;
@@ -5115,7 +5115,7 @@ class WebSocketClient extends Emitter {
5115
5115
 
5116
5116
  updateToken(token ) {
5117
5117
  this.token = token;
5118
- logger$3.info('Wazo WS updating token', { url: this._getUrl(), token, socket: !!this.socket });
5118
+ logger$1.info('Wazo WS updating token', { url: this._getUrl(), token, socket: !!this.socket });
5119
5119
 
5120
5120
  if (this.socket) {
5121
5121
  // If still connected, send the token to the WS
@@ -5133,7 +5133,7 @@ class WebSocketClient extends Emitter {
5133
5133
  }
5134
5134
 
5135
5135
  startHeartbeat() {
5136
- logger$3.info('Wazo WS start heartbeat', { host: this.host, token: this.token });
5136
+ logger$1.info('Wazo WS start heartbeat', { host: this.host, token: this.token });
5137
5137
 
5138
5138
  if (!this.socket) {
5139
5139
  this.heartbeat.stop();
@@ -5147,7 +5147,7 @@ class WebSocketClient extends Emitter {
5147
5147
  }
5148
5148
 
5149
5149
  stopHeartbeat() {
5150
- logger$3.info('Wazo WS stop heartbeat', { host: this.host, token: this.token });
5150
+ logger$1.info('Wazo WS stop heartbeat', { host: this.host, token: this.token });
5151
5151
 
5152
5152
  this.heartbeat.stop();
5153
5153
  }
@@ -5177,7 +5177,7 @@ class WebSocketClient extends Emitter {
5177
5177
  }
5178
5178
 
5179
5179
  reconnect(reason ) {
5180
- logger$3.info('Wazo WS reconnect', { reason, socket: !!this.socket, host: this.host, token: this.token });
5180
+ logger$1.info('Wazo WS reconnect', { reason, socket: !!this.socket, host: this.host, token: this.token });
5181
5181
  if (!this.socket) {
5182
5182
  return;
5183
5183
  }
@@ -5233,7 +5233,7 @@ class WebSocketClient extends Emitter {
5233
5233
  this.close();
5234
5234
  }
5235
5235
  const url = `wss://${this.host || ''}/api/websocketd/?token=${this.token || ''}&version=${this.version}`;
5236
- logger$3.log('Wazo WS url computed to reconnect', { url });
5236
+ logger$1.log('Wazo WS url computed to reconnect', { url });
5237
5237
 
5238
5238
  return url;
5239
5239
  }
@@ -5241,12 +5241,12 @@ class WebSocketClient extends Emitter {
5241
5241
  _onHeartbeat(message ) {
5242
5242
  if (message.payload === 'pong') {
5243
5243
  this.heartbeat.onHeartbeat();
5244
- logger$3.log('on heartbeat received from Wazo WS');
5244
+ logger$1.log('on heartbeat received from Wazo WS');
5245
5245
  }
5246
5246
  }
5247
5247
 
5248
5248
  async _onHeartbeatTimeout() {
5249
- logger$3.log('heartbeat timed out', { host: this.host, token: this.token });
5249
+ logger$1.log('heartbeat timed out', { host: this.host, token: this.token });
5250
5250
 
5251
5251
  this.close();
5252
5252
  this.eventEmitter.emit(SOCKET_EVENTS.ON_CLOSE, new Error('Websocket ping failure.'));
@@ -5367,7 +5367,7 @@ var wazoWebsocket = {
5367
5367
 
5368
5368
  /* */
5369
5369
 
5370
- const parseCandidate = (candidate ) => {
5370
+ const parseCandidate$1 = (candidate ) => {
5371
5371
  if (!candidate) {
5372
5372
  return null;
5373
5373
  }
@@ -5479,11 +5479,16 @@ class WazoSessionDescriptionHandler extends SessionDescriptionHandler {
5479
5479
 
5480
5480
  // $FlowFixMe
5481
5481
  setRemoteSessionDescription(sessionDescription ) {
5482
- const result = super.setRemoteSessionDescription(sessionDescription);
5482
+ try {
5483
+ const result = super.setRemoteSessionDescription(sessionDescription);
5483
5484
 
5484
- this.eventEmitter.emit('setDescription', sessionDescription);
5485
+ this.eventEmitter.emit('setDescription', sessionDescription);
5485
5486
 
5486
- return result;
5487
+ return result;
5488
+ } catch (error) {
5489
+ this.logger.error('SessionDescriptionHandler.setRemoteSessionDescription error', error);
5490
+ throw error;
5491
+ }
5487
5492
  }
5488
5493
 
5489
5494
  // Overridden to avoid to fix ice-candidates missing in the SDP in react-native and chrome canary.
@@ -5521,7 +5526,7 @@ class WazoSessionDescriptionHandler extends SessionDescriptionHandler {
5521
5526
  this.peerConnectionDelegate.onicecandidate = event => {
5522
5527
  wazoLogger.trace('onicecandidate', event.candidate ? event.candidate.candidate : { done: true });
5523
5528
  if (event.candidate) {
5524
- this.gatheredCandidates.push(parseCandidate(event.candidate.candidate));
5529
+ this.gatheredCandidates.push(parseCandidate$1(event.candidate.candidate));
5525
5530
  }
5526
5531
  };
5527
5532
 
@@ -5890,7 +5895,7 @@ const DEFAULT_ICE_TIMEOUT = 3000;
5890
5895
  const SEND_STATS_DELAY = 5000;
5891
5896
 
5892
5897
  const states = ['STATUS_NULL', 'STATUS_NEW', 'STATUS_CONNECTING', 'STATUS_CONNECTED', 'STATUS_COMPLETED'];
5893
- const logger$4 = IssueReporter$1 ? IssueReporter$1.loggerFor('webrtc-client') : console;
5898
+ const logger = IssueReporter$1 ? IssueReporter$1.loggerFor('webrtc-client') : console;
5894
5899
  const statsLogger = IssueReporter$1 ? IssueReporter$1.loggerFor('webrtc-stats') : console;
5895
5900
 
5896
5901
  // events
@@ -6066,13 +6071,13 @@ class WebRTCClient extends Emitter {
6066
6071
 
6067
6072
  createUserAgent(configOverrides ) {
6068
6073
  const webRTCConfiguration = this._createWebRTCConfiguration(configOverrides);
6069
- logger$4.info('sdk webrtc, creating UA', { webRTCConfiguration });
6074
+ logger.info('sdk webrtc, creating UA', { webRTCConfiguration });
6070
6075
 
6071
6076
  webRTCConfiguration.delegate = {
6072
6077
  onConnect: this.onConnect.bind(this),
6073
6078
  onDisconnect: this.onDisconnect.bind(this),
6074
6079
  onInvite: (invitation ) => {
6075
- logger$4.info('sdk webrtc on invite', {
6080
+ logger.info('sdk webrtc on invite', {
6076
6081
  method: 'delegate.onInvite',
6077
6082
  id: invitation.id,
6078
6083
  remoteURI: invitation.remoteURI,
@@ -6115,7 +6120,7 @@ class WebRTCClient extends Emitter {
6115
6120
  }
6116
6121
 
6117
6122
  onConnect() {
6118
- logger$4.info('sdk webrtc connected', { method: 'delegate.onConnect' });
6123
+ logger.info('sdk webrtc connected', { method: 'delegate.onConnect' });
6119
6124
  this.eventEmitter.emit(CONNECTED);
6120
6125
  if (!this.isRegistered() && this.registerer && this.registerer.waiting) {
6121
6126
  this.registerer.waitingToggle(false);
@@ -6124,7 +6129,7 @@ class WebRTCClient extends Emitter {
6124
6129
  }
6125
6130
 
6126
6131
  async onDisconnect(error ) {
6127
- logger$4.info('sdk webrtc disconnected', { method: 'delegate.onConnect', error });
6132
+ logger.info('sdk webrtc disconnected', { method: 'delegate.onConnect', error });
6128
6133
  this.connectionPromise = null;
6129
6134
  // The UA will attempt to reconnect automatically when an error occurred
6130
6135
  this.eventEmitter.emit(DISCONNECTED, error);
@@ -6149,37 +6154,37 @@ class WebRTCClient extends Emitter {
6149
6154
  };
6150
6155
 
6151
6156
  if (this.skipRegister) {
6152
- logger$4.info('sdk webrtc skip register...', logInfo);
6157
+ logger.info('sdk webrtc skip register...', logInfo);
6153
6158
  return Promise.resolve();
6154
6159
  }
6155
6160
 
6156
- logger$4.info('sdk webrtc registering...', logInfo);
6161
+ logger.info('sdk webrtc registering...', logInfo);
6157
6162
 
6158
6163
  if (!this.userAgent) {
6159
- logger$4.info('sdk webrtc recreating User Agent');
6164
+ logger.info('sdk webrtc recreating User Agent');
6160
6165
  this.userAgent = this.createUserAgent(this.uaConfigOverrides);
6161
6166
  }
6162
6167
  if (!this.userAgent || this.isRegistered()) {
6163
- logger$4.info('sdk webrtc registering aborted, already registered or no UA can be created');
6168
+ logger.info('sdk webrtc registering aborted, already registered or no UA can be created');
6164
6169
  return Promise.resolve();
6165
6170
  }
6166
6171
 
6167
6172
  if (this.connectionPromise || (this.registerer && this.registerer.waiting)) {
6168
- logger$4.info('sdk webrtc registering aborted due to a registration in progress.');
6173
+ logger.info('sdk webrtc registering aborted due to a registration in progress.');
6169
6174
  return Promise.resolve();
6170
6175
  }
6171
6176
 
6172
6177
  const registerOptions = this._isWeb() ? {} : { extraContactHeaderParams: ['mobility=mobile'] };
6173
6178
 
6174
6179
  const onRegisterFailed = () => {
6175
- logger$4.info('sdk webrtc registering failed', { tries, registerer: !!this.registerer });
6180
+ logger.info('sdk webrtc registering failed', { tries, registerer: !!this.registerer });
6176
6181
  this.connectionPromise = null;
6177
6182
  if (this.registerer && this.registerer.waiting) {
6178
6183
  this.registerer.waitingToggle(false);
6179
6184
  }
6180
6185
 
6181
6186
  if (tries <= MAX_REGISTER_TRIES) {
6182
- logger$4.info('sdk webrtc registering, retrying...', { tries });
6187
+ logger.info('sdk webrtc registering, retrying...', { tries });
6183
6188
  setTimeout(() => this.register(tries + 1), 300);
6184
6189
  }
6185
6190
  };
@@ -6188,18 +6193,18 @@ class WebRTCClient extends Emitter {
6188
6193
  // Avoid race condition with the close method called just before register and setting userAgent to null
6189
6194
  // during the resolution of the primise.
6190
6195
  if (!this.userAgent) {
6191
- logger$4.info('sdk webrtc recreating User Agent after connection');
6196
+ logger.info('sdk webrtc recreating User Agent after connection');
6192
6197
  this.userAgent = this.createUserAgent(this.uaConfigOverrides);
6193
6198
  }
6194
6199
 
6195
- logger$4.info('sdk webrtc registering, transport connected', { registerOptions, ua: !!this.userAgent });
6200
+ logger.info('sdk webrtc registering, transport connected', { registerOptions, ua: !!this.userAgent });
6196
6201
  this.registerer = new Registerer(this.userAgent, registerOptions);
6197
6202
  this.connectionPromise = null;
6198
6203
  this._monkeyPatchRegisterer(this.registerer);
6199
6204
 
6200
6205
  // Bind registerer events
6201
6206
  this.registerer.stateChange.addListener(newState => {
6202
- logger$4.info('sdk webrtc registering, state changed', { newState });
6207
+ logger.info('sdk webrtc registering, state changed', { newState });
6203
6208
 
6204
6209
  if (newState === RegistererState.Registered && this.registerer
6205
6210
  && this.registerer.state === RegistererState.Registered) {
@@ -6212,7 +6217,7 @@ class WebRTCClient extends Emitter {
6212
6217
  const options = {
6213
6218
  requestDelegate: {
6214
6219
  onReject: response => {
6215
- logger$4.error('sdk webrtc registering, rejected', { response });
6220
+ logger.error('sdk webrtc registering, rejected', { response });
6216
6221
 
6217
6222
  onRegisterFailed();
6218
6223
  },
@@ -6220,13 +6225,13 @@ class WebRTCClient extends Emitter {
6220
6225
  };
6221
6226
 
6222
6227
  return this.registerer.register(options).catch((e) => {
6223
- logger$4.error('sdk webrtc registering, error', e);
6228
+ logger.error('sdk webrtc registering, error', e);
6224
6229
 
6225
6230
  this.eventEmitter.emit(REGISTRATION_FAILED);
6226
6231
  return e;
6227
6232
  });
6228
6233
  }).catch(error => {
6229
- logger$4.error('sdk webrtc registering, transport error', error);
6234
+ logger.error('sdk webrtc registering, transport error', error);
6230
6235
  onRegisterFailed();
6231
6236
  });
6232
6237
  }
@@ -6255,21 +6260,21 @@ class WebRTCClient extends Emitter {
6255
6260
  }
6256
6261
 
6257
6262
  unregister() {
6258
- logger$4.info('sdk webrtc unregistering..', { userAgent: !!this.userAgent, registerer: !!this.registerer });
6263
+ logger.info('sdk webrtc unregistering..', { userAgent: !!this.userAgent, registerer: !!this.registerer });
6259
6264
  if (!this.registerer) {
6260
6265
  return Promise.resolve();
6261
6266
  }
6262
6267
 
6263
6268
  try {
6264
6269
  return this.registerer.unregister().then(() => {
6265
- logger$4.info('sdk webrtc unregistered');
6270
+ logger.info('sdk webrtc unregistered');
6266
6271
  this._cleanupRegister();
6267
6272
  }).catch(e => {
6268
- logger$4.error('sdk webrtc unregistering, promise error', e);
6273
+ logger.error('sdk webrtc unregistering, promise error', e);
6269
6274
  this._cleanupRegister();
6270
6275
  });
6271
6276
  } catch (e) {
6272
- logger$4.error('sdk webrtc unregistering, error', e);
6277
+ logger.error('sdk webrtc unregistering, error', e);
6273
6278
  // Avoid issue with `undefined is not an object (evaluating 'new.target.prototype')` when triggering a new
6274
6279
  // error when the registerer is in a bad state
6275
6280
  this._cleanupRegister();
@@ -6277,7 +6282,7 @@ class WebRTCClient extends Emitter {
6277
6282
  }
6278
6283
 
6279
6284
  stop() {
6280
- logger$4.info('sdk webrtc stop', { userAgent: !!this.userAgent });
6285
+ logger.info('sdk webrtc stop', { userAgent: !!this.userAgent });
6281
6286
  if (!this.userAgent) {
6282
6287
  return Promise.resolve();
6283
6288
  }
@@ -6285,12 +6290,12 @@ class WebRTCClient extends Emitter {
6285
6290
  return this.userAgent.stop().then(() => {
6286
6291
  return this._cleanupRegister();
6287
6292
  }).catch(e => {
6288
- logger$4.warn('sdk webrtc stop, error', { message: e.message, stack: e.stack });
6293
+ logger.warn('sdk webrtc stop, error', { message: e.message, stack: e.stack });
6289
6294
  });
6290
6295
  }
6291
6296
 
6292
6297
  call(number , enableVideo , audioOnly = false, conference = false) {
6293
- logger$4.info('sdk webrtc creating call', { number, enableVideo, audioOnly });
6298
+ logger.info('sdk webrtc creating call', { number, enableVideo, audioOnly, conference });
6294
6299
  const inviterOptions = {
6295
6300
  sessionDescriptionHandlerOptionsReInvite: {
6296
6301
  conference,
@@ -6321,7 +6326,7 @@ class WebRTCClient extends Emitter {
6321
6326
  this._onAccepted(session, response.session, true);
6322
6327
  },
6323
6328
  onReject: (response ) => {
6324
- logger$4.info('on call rejected', { id: session.id, fromTag: session.fromTag });
6329
+ logger.info('on call rejected', { id: session.id, fromTag: session.fromTag });
6325
6330
  this._stopSendingStats(session);
6326
6331
  this.stopNetworkMonitoring(session);
6327
6332
 
@@ -6344,11 +6349,11 @@ class WebRTCClient extends Emitter {
6344
6349
  }
6345
6350
 
6346
6351
  answer(session , enableVideo ) {
6347
- logger$4.info('sdk webrtc answer call', { id: session.id, enableVideo });
6352
+ logger.info('sdk webrtc answer call', { id: session.id, enableVideo });
6348
6353
 
6349
6354
  if (!session || !session.accept) {
6350
6355
  const error = 'No session to answer, or not an invitation';
6351
- logger$4.warn(error);
6356
+ logger.warn(error);
6352
6357
  return Promise.reject(new Error(error));
6353
6358
  }
6354
6359
  const options = {
@@ -6358,15 +6363,15 @@ class WebRTCClient extends Emitter {
6358
6363
  return session.accept(options).then(() => {
6359
6364
  if (session.isCanceled) {
6360
6365
  const message = 'accepted a canceled session (or was canceled during the accept phase).';
6361
- logger$4.error(message, { id: session.id });
6366
+ logger.error(message, { id: session.id });
6362
6367
  this.onCallEnded(session);
6363
6368
 
6364
6369
  throw new CanceledCallError(message);
6365
6370
  }
6366
- logger$4.info('sdk webrtc answer, accepted.');
6371
+ logger.info('sdk webrtc answer, accepted.');
6367
6372
  this._onAccepted(session);
6368
6373
  }).catch(e => {
6369
- logger$4.error(`answer call error for ${session ? session.id : 'n/a'}`, e);
6374
+ logger.error(`answer call error for ${session ? session.id : 'n/a'}`, e);
6370
6375
 
6371
6376
  throw e;
6372
6377
  });
@@ -6374,7 +6379,7 @@ class WebRTCClient extends Emitter {
6374
6379
 
6375
6380
  hangup(session ) {
6376
6381
  const { state, id } = session;
6377
- logger$4.info('sdk webrtc hangup call', { id, state });
6382
+ logger.info('sdk webrtc hangup call', { id, state });
6378
6383
 
6379
6384
  try {
6380
6385
  this._stopSendingStats(session);
@@ -6403,7 +6408,7 @@ class WebRTCClient extends Emitter {
6403
6408
 
6404
6409
  return bye();
6405
6410
  } catch (error) {
6406
- logger$4.warn('sdk webrtc hangup, error', error);
6411
+ logger.warn('sdk webrtc hangup, error', error);
6407
6412
  }
6408
6413
 
6409
6414
  return null;
@@ -6421,7 +6426,7 @@ class WebRTCClient extends Emitter {
6421
6426
  // Fetch and emit an event at `interval` with session network stats
6422
6427
  startNetworkMonitoring(session , interval = 1000) {
6423
6428
  const sessionId = this.getSipSessionId(session);
6424
- logger$4.info('starting network inspection', { id: sessionId });
6429
+ logger.info('starting network inspection', { id: sessionId });
6425
6430
 
6426
6431
  this.sessionNetworkStats[sessionId] = [];
6427
6432
 
@@ -6431,7 +6436,7 @@ class WebRTCClient extends Emitter {
6431
6436
  stopNetworkMonitoring(session ) {
6432
6437
  const sessionId = this.getSipSessionId(session);
6433
6438
  const exists = sessionId in this.networkMonitoringInterval;
6434
- logger$4.info('stopping network inspection', { id: sessionId, exists });
6439
+ logger.info('stopping network inspection', { id: sessionId, exists });
6435
6440
 
6436
6441
  if (exists) {
6437
6442
  clearInterval(this.networkMonitoringInterval[sessionId]);
@@ -6441,17 +6446,17 @@ class WebRTCClient extends Emitter {
6441
6446
  }
6442
6447
 
6443
6448
  reject(session ) {
6444
- logger$4.info('sdk webrtc reject call', { id: session.id });
6449
+ logger.info('sdk webrtc reject call', { id: session.id });
6445
6450
 
6446
6451
  try {
6447
6452
  return session.reject ? session.reject() : session.cancel();
6448
6453
  } catch (e) {
6449
- logger$4.warn('Error when rejecting call', e.message, e.stack);
6454
+ logger.warn('Error when rejecting call', e.message, e.stack);
6450
6455
  }
6451
6456
  }
6452
6457
 
6453
6458
  async close() {
6454
- logger$4.info('sdk webrtc closing client', { userAgent: !!this.userAgent });
6459
+ logger.info('sdk webrtc closing client', { userAgent: !!this.userAgent });
6455
6460
  this._cleanupMedia();
6456
6461
  this.connectionPromise = null;
6457
6462
 
@@ -6482,7 +6487,7 @@ class WebRTCClient extends Emitter {
6482
6487
  // eg: "INVITE not rejectable in state Completed"
6483
6488
  }
6484
6489
  this.userAgent = null;
6485
- logger$4.info('sdk webrtc client closed');
6490
+ logger.info('sdk webrtc client closed');
6486
6491
  }
6487
6492
 
6488
6493
  getNumber(session ) {
@@ -6495,13 +6500,13 @@ class WebRTCClient extends Emitter {
6495
6500
  }
6496
6501
 
6497
6502
  mute(session ) {
6498
- logger$4.info('sdk webrtc mute', { id: session.id });
6503
+ logger.info('sdk webrtc mute', { id: session.id });
6499
6504
 
6500
6505
  this._toggleAudio(session, true);
6501
6506
  }
6502
6507
 
6503
6508
  unmute(session ) {
6504
- logger$4.info('sdk webrtc unmute', { id: session.id });
6509
+ logger.info('sdk webrtc unmute', { id: session.id });
6505
6510
 
6506
6511
  this._toggleAudio(session, false);
6507
6512
  }
@@ -6541,13 +6546,13 @@ class WebRTCClient extends Emitter {
6541
6546
  }
6542
6547
 
6543
6548
  toggleCameraOn(session ) {
6544
- logger$4.info('sdk webrtc toggle camera on', { id: session.id });
6549
+ logger.info('sdk webrtc toggle camera on', { id: session.id });
6545
6550
 
6546
6551
  this._toggleVideo(session, false);
6547
6552
  }
6548
6553
 
6549
6554
  toggleCameraOff(session ) {
6550
- logger$4.info('sdk webrtc toggle camera off', { id: session.id });
6555
+ logger.info('sdk webrtc toggle camera off', { id: session.id });
6551
6556
 
6552
6557
  this._toggleVideo(session, true);
6553
6558
  }
@@ -6556,7 +6561,7 @@ class WebRTCClient extends Emitter {
6556
6561
  const sessionId = this.getSipSessionId(session);
6557
6562
  const hasVideo = hadVideo || this.hasLocalVideo(sessionId);
6558
6563
 
6559
- logger$4.info('sdk webrtc hold', {
6564
+ logger.info('sdk webrtc hold', {
6560
6565
  sessionId,
6561
6566
  keys: Object.keys(this.heldSessions),
6562
6567
  pendingReinvite: !!session.pendingReinvite,
@@ -6605,7 +6610,7 @@ class WebRTCClient extends Emitter {
6605
6610
  const sessionId = this.getSipSessionId(session);
6606
6611
  const hasVideo = sessionId in this.heldSessions && this.heldSessions[sessionId].hasVideo;
6607
6612
 
6608
- logger$4.info('sdk webrtc unhold', {
6613
+ logger.info('sdk webrtc unhold', {
6609
6614
  sessionId,
6610
6615
  keys: Object.keys(this.heldSessions),
6611
6616
  pendingReinvite: !!session.pendingReinvite,
@@ -6753,7 +6758,7 @@ class WebRTCClient extends Emitter {
6753
6758
  if (!session.sessionDescriptionHandler) {
6754
6759
  return;
6755
6760
  }
6756
- logger$4.info('Sending DTMF', {
6761
+ logger.info('Sending DTMF', {
6757
6762
  id: this.getSipSessionId(session),
6758
6763
  tone,
6759
6764
  });
@@ -6769,7 +6774,7 @@ class WebRTCClient extends Emitter {
6769
6774
  transfer(session , target ) {
6770
6775
  this.hold(session);
6771
6776
 
6772
- logger$4.info('Transfering a session', {
6777
+ logger.info('Transfering a session', {
6773
6778
  id: this.getSipSessionId(session),
6774
6779
  target,
6775
6780
  });
@@ -6791,17 +6796,17 @@ class WebRTCClient extends Emitter {
6791
6796
  atxfer(session ) {
6792
6797
  this.hold(session);
6793
6798
 
6794
- logger$4.info('webrtc transfer started', { id: this.getSipSessionId(session) });
6799
+ logger.info('webrtc transfer started', { id: this.getSipSessionId(session) });
6795
6800
 
6796
6801
  const result = {
6797
6802
  newSession: null,
6798
6803
  init: async (target ) => {
6799
- logger$4.info('webrtc transfer initialized', { id: this.getSipSessionId(session), target });
6804
+ logger.info('webrtc transfer initialized', { id: this.getSipSessionId(session), target });
6800
6805
 
6801
6806
  result.newSession = await this.call(target);
6802
6807
  },
6803
6808
  complete: () => {
6804
- logger$4.info('webrtc transfer completed', {
6809
+ logger.info('webrtc transfer completed', {
6805
6810
  id: this.getSipSessionId(session),
6806
6811
  referId: this.getSipSessionId(result.newSession),
6807
6812
  });
@@ -6822,7 +6827,7 @@ class WebRTCClient extends Emitter {
6822
6827
  return;
6823
6828
  }
6824
6829
 
6825
- logger$4.info('send WebRTC message', { sipId: sipSession.id, contentType });
6830
+ logger.info('send WebRTC message', { sipId: sipSession.id, contentType });
6826
6831
 
6827
6832
  try {
6828
6833
  sipSession.message({
@@ -6864,7 +6869,7 @@ class WebRTCClient extends Emitter {
6864
6869
  }
6865
6870
 
6866
6871
  changeAudioOutputVolume(volume ) {
6867
- logger$4.info('Changing audio output volume', { volume });
6872
+ logger.info('Changing audio output volume', { volume });
6868
6873
 
6869
6874
  Object.values(this.audioElements).forEach(audioElement => {
6870
6875
  if (audioElement instanceof HTMLAudioElement) {
@@ -6876,7 +6881,7 @@ class WebRTCClient extends Emitter {
6876
6881
  }
6877
6882
 
6878
6883
  changeAudioOutputDevice(id ) {
6879
- logger$4.info('Changing audio output device', { id });
6884
+ logger.info('Changing audio output device', { id });
6880
6885
 
6881
6886
  Object.values(this.audioElements).forEach(audioElement => {
6882
6887
  // `setSinkId` method is not included in any flow type definitions for HTMLAudioElements but is a valid method
@@ -6893,7 +6898,7 @@ class WebRTCClient extends Emitter {
6893
6898
 
6894
6899
  changeAudioInputDevice(id , session ) {
6895
6900
  const currentId = this.getAudioDeviceId();
6896
- logger$4.info('setting audio input device', { id, currentId, session: !!session });
6901
+ logger.info('setting audio input device', { id, currentId, session: !!session });
6897
6902
 
6898
6903
  if (id === currentId) {
6899
6904
  return null;
@@ -6939,7 +6944,7 @@ class WebRTCClient extends Emitter {
6939
6944
 
6940
6945
  setVideoInputDevice(id ) {
6941
6946
  const currentId = this.getVideoDeviceId();
6942
- logger$4.info('setting video input device', { id, currentId });
6947
+ logger.info('setting video input device', { id, currentId });
6943
6948
 
6944
6949
  if (id === currentId) {
6945
6950
  return null;
@@ -6964,7 +6969,7 @@ class WebRTCClient extends Emitter {
6964
6969
  const sessionId = this.getSipSessionId(session);
6965
6970
  const localStream = this.getLocalStream(sessionId);
6966
6971
 
6967
- logger$4.info('changing video input device', { id, sessionId });
6972
+ logger.info('changing video input device', { id, sessionId });
6968
6973
 
6969
6974
  // Release old video stream
6970
6975
  if (localStream) {
@@ -7032,7 +7037,7 @@ class WebRTCClient extends Emitter {
7032
7037
  const shouldDoScreenSharing = newConstraints && newConstraints.screen;
7033
7038
  const desktop = newConstraints && newConstraints.desktop;
7034
7039
 
7035
- logger$4.info('Sending reinvite', {
7040
+ logger.info('Sending reinvite', {
7036
7041
  id: this.getSipSessionId(sipSession),
7037
7042
  newConstraints,
7038
7043
  conference,
@@ -7070,7 +7075,7 @@ class WebRTCClient extends Emitter {
7070
7075
  sipSession.incomingInviteRequest.message.body = response.message.body;
7071
7076
  }
7072
7077
 
7073
- logger$4.info('on re-INVITE accepted', {
7078
+ logger.info('on re-INVITE accepted', {
7074
7079
  id: this.getSipSessionId(sipSession),
7075
7080
  wasMuted,
7076
7081
  shouldDoScreenSharing,
@@ -7245,7 +7250,7 @@ class WebRTCClient extends Emitter {
7245
7250
  }
7246
7251
 
7247
7252
  startHeartbeat() {
7248
- logger$4.info('sdk webrtc start heartbeat', { userAgent: !!this.userAgent });
7253
+ logger.info('sdk webrtc start heartbeat', { userAgent: !!this.userAgent });
7249
7254
  if (!this.userAgent) {
7250
7255
  this.heartbeat.stop();
7251
7256
  return;
@@ -7258,7 +7263,7 @@ class WebRTCClient extends Emitter {
7258
7263
  }
7259
7264
 
7260
7265
  stopHeartbeat() {
7261
- logger$4.info('sdk webrtc stop heartbeat');
7266
+ logger.info('sdk webrtc stop heartbeat');
7262
7267
  this.heartbeat.stop();
7263
7268
  }
7264
7269
 
@@ -7279,7 +7284,7 @@ class WebRTCClient extends Emitter {
7279
7284
  }
7280
7285
 
7281
7286
  attemptReconnection() {
7282
- logger$4.info('attempt reconnection', { userAgent: !!this.userAgent });
7287
+ logger.info('attempt reconnection', { userAgent: !!this.userAgent });
7283
7288
  if (!this.userAgent) {
7284
7289
  return;
7285
7290
  }
@@ -7304,7 +7309,7 @@ class WebRTCClient extends Emitter {
7304
7309
  return;
7305
7310
  }
7306
7311
 
7307
- logger$4.info('setting local media stream', {
7312
+ logger.info('setting local media stream', {
7308
7313
  sipSessionId,
7309
7314
  tracks: newStream ? newStream.getTracks() : null,
7310
7315
  });
@@ -7321,7 +7326,7 @@ class WebRTCClient extends Emitter {
7321
7326
 
7322
7327
  const oldStream = this.getLocalStream(sipSessionId);
7323
7328
 
7324
- logger$4.info('updating local stream', {
7329
+ logger.info('updating local stream', {
7325
7330
  sipSessionId,
7326
7331
  oldStream: !!oldStream,
7327
7332
  tracks: newStream.getTracks(),
@@ -7341,7 +7346,7 @@ class WebRTCClient extends Emitter {
7341
7346
  const remoteStream = this.getRemoteStream(sessionId);
7342
7347
  const pc = this.getPeerConnection(sessionId);
7343
7348
 
7344
- logger$4.info('Updating remote stream', {
7349
+ logger.info('Updating remote stream', {
7345
7350
  sessionId,
7346
7351
  tracks: remoteStream ? remoteStream.getTracks() : null,
7347
7352
  receiverTracks: pc && pc.getReceivers ? pc.getReceivers().map(receiver => receiver.track) : null,
@@ -7366,14 +7371,16 @@ class WebRTCClient extends Emitter {
7366
7371
  const screenSharing = constraints && 'screen' in constraints ? constraints.screen : false;
7367
7372
  const isDesktop = constraints && 'desktop' in constraints ? constraints.desktop : false;
7368
7373
  const withAudio = constraints && 'audio' in constraints ? constraints.audio : true;
7374
+ const mandatoryVideo = constraints && typeof constraints.video === 'object' ? constraints.video.mandatory : {};
7369
7375
 
7370
- logger$4.info('Retrieving media a configuration', { enableVideo, screenSharing, isDesktop, withAudio, constraints });
7376
+ logger.info('Retrieving media a configuration', { enableVideo, screenSharing, isDesktop, withAudio, constraints });
7371
7377
 
7372
7378
  return {
7373
7379
  constraints: {
7374
7380
  // Exact constraint are not supported with `getDisplayMedia` and we must have a video=false in desktop screenshare
7375
7381
  audio: screenSharing ? !isDesktop : (withAudio ? this._getAudioConstraints() : false),
7376
- video: screenSharing ? (isDesktop ? ({ mandatory: { chromeMediaSource: 'desktop' } }) : { cursor: 'always' })
7382
+ video: screenSharing ? (isDesktop
7383
+ ? ({ mandatory: { chromeMediaSource: 'desktop', ...(mandatoryVideo || {}) } }) : { cursor: 'always' })
7377
7384
  : this._getVideoConstraints(enableVideo),
7378
7385
  screen: screenSharing,
7379
7386
  desktop: isDesktop,
@@ -7416,7 +7423,7 @@ class WebRTCClient extends Emitter {
7416
7423
  }
7417
7424
 
7418
7425
  _onTransportError() {
7419
- logger$4.error('on transport error');
7426
+ logger.error('on transport error');
7420
7427
  this.eventEmitter.emit(TRANSPORT_ERROR);
7421
7428
  this.attemptReconnection();
7422
7429
  }
@@ -7425,7 +7432,7 @@ class WebRTCClient extends Emitter {
7425
7432
  const body = message && typeof message === 'object' ? message.data : message;
7426
7433
  if (body && body.indexOf('200 OK') !== -1) {
7427
7434
  if (this.hasHeartbeat()) {
7428
- logger$4.info('on heartbeat received from Asterisk', { hasHeartbeat: this.hasHeartbeat() });
7435
+ logger.info('on heartbeat received from Asterisk', { hasHeartbeat: this.hasHeartbeat() });
7429
7436
 
7430
7437
  this.heartbeat.onHeartbeat();
7431
7438
  if (this.heartbeatCb) {
@@ -7436,7 +7443,7 @@ class WebRTCClient extends Emitter {
7436
7443
  }
7437
7444
 
7438
7445
  async _onHeartbeatTimeout() {
7439
- logger$4.info('sdk webrtc heartbeat timed out', { userAgent: !!this.userAgent, cb: !!this.heartbeatTimeoutCb });
7446
+ logger.info('sdk webrtc heartbeat timed out', { userAgent: !!this.userAgent, cb: !!this.heartbeatTimeoutCb });
7440
7447
 
7441
7448
  if (this.heartbeatTimeoutCb) {
7442
7449
  this.heartbeatTimeoutCb();
@@ -7448,7 +7455,7 @@ class WebRTCClient extends Emitter {
7448
7455
  try {
7449
7456
  await this.userAgent.transport.disconnect();
7450
7457
  } catch (e) {
7451
- logger$4.error('Transport disconnection after heartbeat timeout, error', e);
7458
+ logger.error('Transport disconnection after heartbeat timeout, error', e);
7452
7459
  }
7453
7460
  }
7454
7461
 
@@ -7481,31 +7488,31 @@ class WebRTCClient extends Emitter {
7481
7488
  }
7482
7489
 
7483
7490
  _connectIfNeeded() {
7484
- logger$4.info('connect if needed, checking', { connected: this.isConnected() });
7491
+ logger.info('connect if needed, checking', { connected: this.isConnected() });
7485
7492
  if (!this.userAgent) {
7486
- logger$4.info('need to recreate User Agent');
7493
+ logger.info('need to recreate User Agent');
7487
7494
  this.userAgent = this.createUserAgent(this.uaConfigOverrides);
7488
7495
  }
7489
7496
 
7490
7497
  if (this.isConnected()) {
7491
- logger$4.info('webrtc sdk, already connected');
7498
+ logger.info('webrtc sdk, already connected');
7492
7499
  return Promise.resolve();
7493
7500
  }
7494
7501
 
7495
7502
  if (this.isConnecting()) {
7496
- logger$4.info('webrtc sdk, already connecting...');
7503
+ logger.info('webrtc sdk, already connecting...');
7497
7504
 
7498
7505
  this.connectionPromise = this.userAgent.transport.connectPromise;
7499
7506
  return this.connectionPromise;
7500
7507
  }
7501
7508
 
7502
7509
  if (this.connectionPromise) {
7503
- logger$4.info('webrtc sdk, connection promise connecting...');
7510
+ logger.info('webrtc sdk, connection promise connecting...');
7504
7511
  // $FlowFixMe
7505
7512
  return this.connectionPromise;
7506
7513
  }
7507
7514
 
7508
- logger$4.info('WebRTC UA needs to connect');
7515
+ logger.info('WebRTC UA needs to connect');
7509
7516
 
7510
7517
  // Force UA to reconnect
7511
7518
  if (this.userAgent && this.userAgent.state !== UserAgentState.Stopped) {
@@ -7630,7 +7637,7 @@ class WebRTCClient extends Emitter {
7630
7637
 
7631
7638
  sdh.peerConnectionDelegate = {
7632
7639
  onicecandidateerror: (error ) => {
7633
- logger$4.error('on icecandidate error', {
7640
+ logger.error('on icecandidate error', {
7634
7641
  address: error.address,
7635
7642
  port: error.port,
7636
7643
  errorCode: error.errorCode,
@@ -7659,7 +7666,7 @@ class WebRTCClient extends Emitter {
7659
7666
  updatedNumber = session.assertedIdentity.uri.normal.user;
7660
7667
  updatedCalleeName = session.assertedIdentity.displayName || updatedNumber;
7661
7668
  }
7662
- logger$4.info('re-invite received', { updatedCalleeName, updatedNumber, hadRemoteVideo });
7669
+ logger.info('re-invite received', { updatedCalleeName, updatedNumber, hadRemoteVideo });
7663
7670
 
7664
7671
  // Useful to know if it's a video upgrade or an unhold from a remote peer with a video stream
7665
7672
 
@@ -7680,7 +7687,7 @@ class WebRTCClient extends Emitter {
7680
7687
  }
7681
7688
 
7682
7689
  _onAccepted(session , sessionDialog , withEvent = true) {
7683
- logger$4.info('on call accepted', { id: session.id, remoteTag: session.remoteTag });
7690
+ logger.info('on call accepted', { id: session.id, remoteTag: session.remoteTag });
7684
7691
 
7685
7692
  this.storeSipSession(session);
7686
7693
 
@@ -7692,7 +7699,7 @@ class WebRTCClient extends Emitter {
7692
7699
  const onTrack = (event ) => {
7693
7700
  const isAudioOnly = this._isAudioOnly(session);
7694
7701
  const { kind, label, readyState, id, muted } = event.track;
7695
- logger$4.info('on track event', { isAudioOnly, kind, label, readyState, id, muted });
7702
+ logger.info('on track event', { isAudioOnly, kind, label, readyState, id, muted });
7696
7703
 
7697
7704
  // Stop video track in audio only mode
7698
7705
  if (isAudioOnly && kind === 'video') {
@@ -7708,12 +7715,14 @@ class WebRTCClient extends Emitter {
7708
7715
 
7709
7716
  session.sessionDescriptionHandler.remoteMediaStream.onaddtrack = onTrack;
7710
7717
 
7711
- pc.oniceconnectionstatechange = () => {
7712
- logger$4.info('on ice connection state changed', { state: pc.iceConnectionState });
7713
- if (pc.iceConnectionState === 'disconnected') {
7714
- this.eventEmitter.emit(ON_DISCONNECTED);
7715
- }
7716
- };
7718
+ if (pc) {
7719
+ pc.oniceconnectionstatechange = () => {
7720
+ logger.info('on ice connection state changed', { state: pc.iceConnectionState });
7721
+ if (pc.iceConnectionState === 'disconnected') {
7722
+ this.eventEmitter.emit(ON_DISCONNECTED);
7723
+ }
7724
+ };
7725
+ }
7717
7726
 
7718
7727
  if (withEvent) {
7719
7728
  this.eventEmitter.emit(ACCEPTED, session, sessionDialog);
@@ -7882,10 +7891,10 @@ class WebRTCClient extends Emitter {
7882
7891
 
7883
7892
  _stopSendingStats(session ) {
7884
7893
  const sessionId = this.getSipSessionId(session);
7885
- logger$4.trace('Check for stopping stats', { sessionId, ids: Object.keys(this.statsIntervals) });
7894
+ logger.trace('Check for stopping stats', { sessionId, ids: Object.keys(this.statsIntervals) });
7886
7895
 
7887
7896
  if (sessionId in this.statsIntervals) {
7888
- logger$4.trace('Stop sending stats for call', { sessionId });
7897
+ logger.trace('Stop sending stats for call', { sessionId });
7889
7898
  this.statsIntervals[sessionId]();
7890
7899
  delete this.statsIntervals[sessionId];
7891
7900
  }
@@ -7901,7 +7910,7 @@ class WebRTCClient extends Emitter {
7901
7910
  try {
7902
7911
  await this.userAgent.transport.disconnect();
7903
7912
  } catch (e) {
7904
- logger$4.error('WebRTC transport disconnect, error', e);
7913
+ logger.error('WebRTC transport disconnect, error', e);
7905
7914
  }
7906
7915
  }
7907
7916
  }
@@ -7923,13 +7932,17 @@ class WebRTCClient extends Emitter {
7923
7932
  const nbStats = this.sessionNetworkStats[sessionId].length;
7924
7933
  const lastNetworkStats = this.sessionNetworkStats[sessionId][nbStats - 1];
7925
7934
  const lastAudioSent = lastNetworkStats ? lastNetworkStats.audioBytesSent : 0;
7935
+ const lastAudioContentSent = lastNetworkStats ? lastNetworkStats.audioContentSent : 0;
7926
7936
  const lastVideoSent = lastNetworkStats ? lastNetworkStats.videoBytesSent : 0;
7927
7937
  const lastAudioReceived = lastNetworkStats ? lastNetworkStats.audioBytesReceived : 0;
7938
+ const lastAudioContentReceived = lastNetworkStats ? lastNetworkStats.audioContentReceived : 0;
7928
7939
  const lastVideoReceived = lastNetworkStats ? lastNetworkStats.videoBytesReceived : 0;
7929
7940
  const lastTransportSent = lastNetworkStats ? lastNetworkStats.transportSent : 0;
7930
7941
  const lastTransportReceived = lastNetworkStats ? lastNetworkStats.transportReceived : 0;
7931
- let audioBytesSent = 0;
7932
- let audioBytesReceived = 0;
7942
+ let audioBytesSent = 0; // content + header
7943
+ let audioBytesReceived = 0; // content + header
7944
+ let audioContentSent = 0; // useful to detect blank call
7945
+ let audioContentReceived = 0;
7933
7946
  let videoBytesSent = 0;
7934
7947
  let videoBytesReceived = 0;
7935
7948
  let transportSent = 0;
@@ -7939,6 +7952,7 @@ class WebRTCClient extends Emitter {
7939
7952
  stats.forEach(report => {
7940
7953
  if (report.type === 'outbound-rtp' && report.kind === 'audio') {
7941
7954
  audioBytesSent += Number(report.bytesSent) + Number(report.headerBytesSent);
7955
+ audioContentSent += Number(report.bytesSent);
7942
7956
  }
7943
7957
  if (report.type === 'remote-outbound-rtp' && report.kind === 'audio') {
7944
7958
  audioBytesSent += Number(report.bytesSent);
@@ -7950,6 +7964,7 @@ class WebRTCClient extends Emitter {
7950
7964
  packetsLost += Number(report.packetsLost);
7951
7965
  networkStats.packetsReceived = Number(report.packetsReceived);
7952
7966
  audioBytesReceived += Number(report.bytesReceived) + Number(report.headerBytesReceived);
7967
+ audioContentReceived += Number(report.bytesReceived);
7953
7968
  }
7954
7969
  if (report.type === 'inbound-rtp' && report.kind === 'video') {
7955
7970
  videoBytesReceived += Number(report.bytesReceived) + Number(report.headerBytesReceived);
@@ -7978,10 +7993,17 @@ class WebRTCClient extends Emitter {
7978
7993
  });
7979
7994
 
7980
7995
  networkStats.packetsLost = packetsLost;
7996
+
7981
7997
  networkStats.totalAudioBytesSent = audioBytesSent;
7982
7998
  networkStats.audioBytesSent = audioBytesSent - lastAudioSent;
7983
7999
  networkStats.totalAudioBytesReceived = audioBytesReceived - lastAudioReceived;
7984
8000
  networkStats.audioBytesReceived = audioBytesReceived;
8001
+
8002
+ networkStats.totalAudioContentSent = audioContentSent;
8003
+ networkStats.audioContentSent = audioContentSent - lastAudioContentSent;
8004
+ networkStats.totalAudioBytesReceived = audioContentReceived - lastAudioContentReceived;
8005
+ networkStats.audioContentReceived = audioContentReceived;
8006
+
7985
8007
  networkStats.totalVideoBytesSent = videoBytesSent;
7986
8008
  networkStats.videoBytesSent = videoBytesSent - lastVideoSent;
7987
8009
  networkStats.totalVideoBytesReceived = videoBytesReceived;
@@ -8084,7 +8106,7 @@ var webrtc = {
8084
8106
  }),
8085
8107
  };
8086
8108
 
8087
- const parseCandidate$1 = line => {
8109
+ const parseCandidate = line => {
8088
8110
  let parts;
8089
8111
  // Parse both variants.
8090
8112
  if (line.indexOf('a=candidate:') === 0) {
@@ -8175,7 +8197,7 @@ var SymmetricNat = {
8175
8197
  }
8176
8198
 
8177
8199
  if (e.candidate && e.candidate.candidate.indexOf('srflx') !== -1) {
8178
- const cand = parseCandidate$1(e.candidate.candidate);
8200
+ const cand = parseCandidate(e.candidate.candidate);
8179
8201
  if (!candidates[cand.relatedPort]) candidates[cand.relatedPort] = [];
8180
8202
  candidates[cand.relatedPort].push(cand.port);
8181
8203
  } else if (!e.candidate) {
@@ -8243,7 +8265,7 @@ var iceIpv4 = {
8243
8265
  const rawCandidate = e.candidate.candidate;
8244
8266
  if (rawCandidate.indexOf('srflx') !== -1 || rawCandidate.indexOf('relay') !== -1) {
8245
8267
  hasSrflxOrRelay = true;
8246
- const candidate = parseCandidate$1(e.candidate.candidate);
8268
+ const candidate = parseCandidate(e.candidate.candidate);
8247
8269
  ips.push(candidate.ip);
8248
8270
  }
8249
8271
  } else if (!e.candidate) {