@wazo/sdk 0.37.18 → 0.37.22

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 (163) hide show
  1. package/dist/wazo-sdk.js +13 -5
  2. package/esm/__tests__/api-client.test.js +52 -9
  3. package/esm/__tests__/web-rtc-client.test.js +80 -20
  4. package/esm/api/agentd.js +27 -4
  5. package/esm/api/amid.js +27 -4
  6. package/esm/api/application.js +27 -4
  7. package/esm/api/auth.js +29 -5
  8. package/esm/api/call-logd.js +29 -6
  9. package/esm/api/calld.js +27 -4
  10. package/esm/api/chatd.js +27 -4
  11. package/esm/api/confd.js +51 -8
  12. package/esm/api/ctid-ng.js +27 -4
  13. package/esm/api/dird.js +27 -4
  14. package/esm/api/webhookd.js +27 -4
  15. package/esm/api-client.js +54 -11
  16. package/esm/checker/Checker.js +83 -21
  17. package/esm/checker/checks/aor.js +54 -11
  18. package/esm/checker/checks/api.js +54 -11
  19. package/esm/checker/checks/ice-ipv4.js +1 -1
  20. package/esm/checker/checks/index.js +84 -22
  21. package/esm/checker/checks/symmetric-nat.js +1 -1
  22. package/esm/checker/checks/wazo-websocket.js +29 -4
  23. package/esm/checker/checks/webrtc-transport.js +82 -22
  24. package/esm/checker/checks/webrtc.js +82 -22
  25. package/esm/domain/AdHocAPIConference.js +54 -11
  26. package/esm/domain/Agent.js +1 -1
  27. package/esm/domain/BadResponse.js +1 -1
  28. package/esm/domain/Call.js +1 -1
  29. package/esm/domain/CallLog.js +3 -3
  30. package/esm/domain/CallSession.js +1 -1
  31. package/esm/domain/ChatMessage.js +1 -1
  32. package/esm/domain/ChatRoom.js +1 -1
  33. package/esm/domain/Contact.js +2 -1
  34. package/esm/domain/Country.js +1 -1
  35. package/esm/domain/Device/DebugDevice.js +1 -1
  36. package/esm/domain/ExternalApp.js +1 -1
  37. package/esm/domain/Features.js +54 -10
  38. package/esm/domain/ForwardOption.js +2 -1
  39. package/esm/domain/IndirectTransfer.js +1 -1
  40. package/esm/domain/Line.js +1 -1
  41. package/esm/domain/Meeting.js +20 -3
  42. package/esm/domain/NotificationOptions.js +1 -1
  43. package/esm/domain/Phone/CTIPhone.js +55 -11
  44. package/esm/domain/Phone/WebRTCPhone.js +39 -6
  45. package/esm/domain/Profile.js +2 -1
  46. package/esm/domain/Recording.js +2 -2
  47. package/esm/domain/Relocation.js +1 -1
  48. package/esm/domain/Room.js +1 -1
  49. package/esm/domain/ServerError.js +1 -1
  50. package/esm/domain/Session.js +2 -2
  51. package/esm/domain/SipLine.js +1 -1
  52. package/esm/domain/Subscription.js +1 -1
  53. package/esm/domain/SwitchboardCall.js +1 -1
  54. package/esm/domain/Voicemail.js +1 -1
  55. package/esm/domain/__tests__/CallLog.test.js +2 -2
  56. package/esm/index.js +101 -24
  57. package/esm/lib/WazoSessionDescriptionHandler.js +28 -4
  58. package/esm/service/CallApi.js +54 -11
  59. package/esm/service/IssueReporter.js +27 -4
  60. package/esm/service/__tests__/IssueReporter.test.js +26 -3
  61. package/esm/service/getApiClient.js +55 -11
  62. package/esm/simple/Auth.js +101 -23
  63. package/esm/simple/Configuration.js +100 -23
  64. package/esm/simple/Directory.js +53 -10
  65. package/esm/simple/Phone.js +100 -23
  66. package/esm/simple/Websocket.js +30 -4
  67. package/esm/simple/index.js +100 -23
  68. package/esm/simple/room/LocalParticipant.js +113 -40
  69. package/esm/simple/room/Participant.js +112 -37
  70. package/esm/simple/room/RemoteParticipant.js +114 -41
  71. package/esm/simple/room/Room.js +113 -37
  72. package/esm/simple/room/SipRoom.js +101 -26
  73. package/esm/simple/room/Stream.js +101 -26
  74. package/esm/simple/room/__tests__/RemoteParticipant.test.js +99 -22
  75. package/esm/simple/utils.js +99 -22
  76. package/esm/utils/Emitter.js +1 -1
  77. package/esm/utils/Heartbeat.js +1 -1
  78. package/esm/utils/__tests__/api-requester.test.js +26 -3
  79. package/esm/utils/api-requester.js +28 -4
  80. package/esm/utils/compare-version.js +1 -1
  81. package/esm/utils/isMobile.js +1 -1
  82. package/esm/utils/new-from.js +1 -1
  83. package/esm/utils/once.js +1 -1
  84. package/esm/utils/update-from.js +1 -1
  85. package/esm/web-rtc-client.js +83 -22
  86. package/esm/websocket-client.js +30 -4
  87. package/lib/__tests__/api-client.test.js +61 -18
  88. package/lib/__tests__/web-rtc-client.test.js +97 -37
  89. package/lib/api/agentd.js +27 -4
  90. package/lib/api/amid.js +27 -4
  91. package/lib/api/application.js +27 -4
  92. package/lib/api/auth.js +28 -5
  93. package/lib/api/call-logd.js +34 -11
  94. package/lib/api/calld.js +30 -7
  95. package/lib/api/chatd.js +28 -5
  96. package/lib/api/confd.js +51 -8
  97. package/lib/api/ctid-ng.js +30 -7
  98. package/lib/api/dird.js +27 -4
  99. package/lib/api/webhookd.js +27 -4
  100. package/lib/api-client.js +61 -18
  101. package/lib/checker/Checker.js +100 -38
  102. package/lib/checker/checks/aor.js +61 -18
  103. package/lib/checker/checks/api.js +61 -18
  104. package/lib/checker/checks/index.js +100 -38
  105. package/lib/checker/checks/wazo-websocket.js +31 -6
  106. package/lib/checker/checks/webrtc-transport.js +97 -37
  107. package/lib/checker/checks/webrtc.js +97 -37
  108. package/lib/domain/AdHocAPIConference.js +61 -18
  109. package/lib/domain/Call.js +1 -1
  110. package/lib/domain/CallLog.js +7 -7
  111. package/lib/domain/ChatMessage.js +1 -1
  112. package/lib/domain/Contact.js +1 -1
  113. package/lib/domain/Features.js +62 -19
  114. package/lib/domain/ForwardOption.js +1 -1
  115. package/lib/domain/Meeting.js +19 -2
  116. package/lib/domain/Phone/CTIPhone.js +63 -20
  117. package/lib/domain/Phone/WebRTCPhone.js +40 -8
  118. package/lib/domain/Profile.js +1 -1
  119. package/lib/domain/Recording.js +3 -3
  120. package/lib/domain/Voicemail.js +1 -1
  121. package/lib/domain/__tests__/Call.test.js +1 -1
  122. package/lib/domain/__tests__/CallLog.test.js +13 -13
  123. package/lib/domain/__tests__/Voicemail.test.js +1 -1
  124. package/lib/index.js +120 -43
  125. package/lib/lib/WazoSessionDescriptionHandler.js +32 -9
  126. package/lib/service/CallApi.js +61 -18
  127. package/lib/service/IssueReporter.js +27 -4
  128. package/lib/service/__tests__/IssueReporter.test.js +27 -4
  129. package/lib/service/getApiClient.js +62 -19
  130. package/lib/simple/Auth.js +119 -42
  131. package/lib/simple/Configuration.js +118 -41
  132. package/lib/simple/Directory.js +61 -18
  133. package/lib/simple/Phone.js +118 -41
  134. package/lib/simple/Websocket.js +32 -6
  135. package/lib/simple/index.js +118 -41
  136. package/lib/simple/room/LocalParticipant.js +132 -59
  137. package/lib/simple/room/Participant.js +130 -55
  138. package/lib/simple/room/RemoteParticipant.js +133 -60
  139. package/lib/simple/room/Room.js +131 -56
  140. package/lib/simple/room/SipRoom.js +120 -45
  141. package/lib/simple/room/Stream.js +120 -45
  142. package/lib/simple/room/__tests__/RemoteParticipant.test.js +118 -41
  143. package/lib/simple/utils.js +118 -41
  144. package/lib/utils/Emitter.js +1 -1
  145. package/lib/utils/PhoneNumberUtil.js +2 -2
  146. package/lib/utils/__tests__/PhoneNumberUtil.test.js +2 -2
  147. package/lib/utils/__tests__/api-requester.test.js +27 -4
  148. package/lib/utils/__tests__/sdp.test.js +12 -12
  149. package/lib/utils/api-requester.js +28 -5
  150. package/lib/utils/sdp.js +10 -10
  151. package/lib/web-rtc-client.js +98 -38
  152. package/lib/websocket-client.js +33 -7
  153. package/package.json +2 -2
  154. package/src/api/confd.js +5 -2
  155. package/src/domain/CallLog.js +1 -1
  156. package/src/domain/Meeting.js +19 -2
  157. package/src/domain/Phone/WebRTCPhone.js +11 -2
  158. package/src/domain/Recording.js +1 -1
  159. package/src/service/IssueReporter.js +26 -3
  160. package/src/simple/Phone.js +5 -0
  161. package/src/types/WebSocketMessage.js +5 -1
  162. package/src/web-rtc-client.js +28 -11
  163. package/src/websocket-client.js +2 -0
@@ -1646,6 +1646,7 @@ class IssueReporter {
1646
1646
 
1647
1647
 
1648
1648
 
1649
+
1649
1650
 
1650
1651
  constructor() {
1651
1652
  addLevelsTo(this);
@@ -1657,12 +1658,17 @@ class IssueReporter {
1657
1658
  this.bufferTimeout = null;
1658
1659
  this._boundProcessBuffer = this._processBuffer.bind(this);
1659
1660
  this._boundParseLoggerBody = this._parseLoggerBody.bind(this);
1661
+ this._callback = null;
1660
1662
  }
1661
1663
 
1662
1664
  init() {
1663
1665
  this._catchConsole();
1664
1666
  }
1665
1667
 
1668
+ setCallback(cb ) {
1669
+ this._callback = cb;
1670
+ }
1671
+
1666
1672
  configureRemoteClient(configuration = { tag: 'wazo-sdk', host: null, port: null, level: null, extra: {} }) {
1667
1673
  this.remoteClientConfiguration = configuration;
1668
1674
  }
@@ -1698,6 +1704,7 @@ class IssueReporter {
1698
1704
 
1699
1705
  // Handle category label
1700
1706
  let category = null;
1707
+ let skipSendToRemote = false;
1701
1708
  let extra = {};
1702
1709
  if (args[0].indexOf(CATEGORY_PREFIX) === 0) {
1703
1710
  category = args[0].split('=')[1];
@@ -1713,6 +1720,7 @@ class IssueReporter {
1713
1720
  errorMessage: lastArg.message,
1714
1721
  errorStack: lastArg.stack,
1715
1722
  errorType: lastArg.constructor.name,
1723
+ skipSendToRemote: lastArg.skipSendToRemote,
1716
1724
  };
1717
1725
  } else {
1718
1726
  extra = lastArg;
@@ -1721,7 +1729,12 @@ class IssueReporter {
1721
1729
  args.splice(1, 1);
1722
1730
  }
1723
1731
 
1724
- const date = moment__default["default"]().format('YYYY-MM-DD HH:mm:ss.SSS');
1732
+ if (extra.skipSendToRemote) {
1733
+ skipSendToRemote = true;
1734
+ delete extra.skipSendToRemote;
1735
+ }
1736
+
1737
+ const date = moment__default['default']().format('YYYY-MM-DD HH:mm:ss.SSS');
1725
1738
  const message = args.join(', ');
1726
1739
  let consoleMessage = message;
1727
1740
 
@@ -1741,7 +1754,13 @@ class IssueReporter {
1741
1754
  const oldMethod = this.oldConsoleMethods[consoleLevel] || this.oldConsoleMethods.log;
1742
1755
  oldMethod.apply(oldMethod, [date, consoleMessage]);
1743
1756
 
1744
- this._sendToRemoteLogger(level, { date, message, category, ...extra });
1757
+ if (this._callback) {
1758
+ this._callback(level, consoleMessage);
1759
+ }
1760
+
1761
+ if (!skipSendToRemote) {
1762
+ this._sendToRemoteLogger(level, { date, message, category, ...extra });
1763
+ }
1745
1764
  }
1746
1765
 
1747
1766
  logRequest(url , options , response , start ) {
@@ -1886,7 +1905,11 @@ class IssueReporter {
1886
1905
  },
1887
1906
  // $FlowFixMe
1888
1907
  body,
1889
- }).catch(() => {
1908
+ }).catch((e ) => {
1909
+ // $FlowFixMe
1910
+ e.skipSendToRemote = true;
1911
+ this.log('error', this._makeCategory('grafana'), 'Sending log to grafana, error', e);
1912
+
1890
1913
  setTimeout(() => {
1891
1914
  if (isArray) {
1892
1915
  payload = payload.map(message => {
@@ -1898,7 +1921,7 @@ class IssueReporter {
1898
1921
  payload._retry = retry + 1;
1899
1922
  }
1900
1923
 
1901
- this._sendDebugToGrafana(body, retry + 1);
1924
+ this._sendDebugToGrafana(payload, retry + 1);
1902
1925
  }, 5000 + retry * 1000);
1903
1926
  });
1904
1927
  }
@@ -2616,7 +2639,8 @@ class ExternalApp {
2616
2639
 
2617
2640
 
2618
2641
 
2619
-
2642
+
2643
+
2620
2644
 
2621
2645
 
2622
2646
  class Meeting {
@@ -2628,6 +2652,7 @@ class Meeting {
2628
2652
 
2629
2653
 
2630
2654
 
2655
+
2631
2656
 
2632
2657
 
2633
2658
  static parse(plain ) {
@@ -2639,14 +2664,28 @@ class Meeting {
2639
2664
  port: plain.port,
2640
2665
  uuid: plain.uuid,
2641
2666
  number: plain.number,
2667
+ persistent: plain.persistent,
2642
2668
  });
2643
2669
  }
2644
2670
 
2671
+ static parseMany(items ) {
2672
+ return items.map(plain => Meeting.parse(plain));
2673
+ }
2674
+
2645
2675
  static newFrom(meeting ) {
2646
2676
  return newFrom(meeting, Meeting);
2647
2677
  }
2648
2678
 
2649
- constructor({ uuid, name, guestSipAuthorization, ownerUuids, port, uri, number } = {}) {
2679
+ constructor({
2680
+ uuid,
2681
+ name,
2682
+ guestSipAuthorization,
2683
+ ownerUuids,
2684
+ port,
2685
+ uri,
2686
+ number,
2687
+ persistent,
2688
+ } = {}) {
2650
2689
  this.guestSipAuthorization = guestSipAuthorization;
2651
2690
  this.uri = uri;
2652
2691
  this.name = name;
@@ -2654,6 +2693,7 @@ class Meeting {
2654
2693
  this.port = port;
2655
2694
  this.uuid = uuid;
2656
2695
  this.number = number;
2696
+ this.persistent = persistent;
2657
2697
 
2658
2698
  // Useful to compare instead of instanceof with minified code
2659
2699
  this.type = 'Meeting';
@@ -2731,8 +2771,11 @@ var confdMethods = (client , baseUrl ) => ({
2731
2771
  }
2732
2772
  },
2733
2773
 
2734
- createMyMeeting: (name ) =>
2735
- client.post(`${baseUrl}/users/me/meetings`, { name }).then(Meeting.parse),
2774
+ getMyMeetings: () =>
2775
+ client.get(`${baseUrl}/users/me/meetings`).then(response => Meeting.parseMany(response.items)),
2776
+
2777
+ createMyMeeting: (name , persistent ) =>
2778
+ client.post(`${baseUrl}/users/me/meetings`, { name, persistent }).then(Meeting.parse),
2736
2779
 
2737
2780
  deleteMyMeeting: (meetingUuid ) =>
2738
2781
  client.delete(`${baseUrl}/users/me/meetings/${meetingUuid}`, null),
@@ -2834,7 +2877,7 @@ class ChatMessage {
2834
2877
  static parse(plain ) {
2835
2878
  return new ChatMessage({
2836
2879
  uuid: plain.uuid,
2837
- date: moment__default["default"](plain.created_at).toDate(),
2880
+ date: moment__default['default'](plain.created_at).toDate(),
2838
2881
  content: plain.content,
2839
2882
  alias: plain.alias,
2840
2883
  userUuid: plain.user_uuid,
@@ -2926,7 +2969,7 @@ class Voicemail {
2926
2969
  static parse(plain ) {
2927
2970
  return new Voicemail({
2928
2971
  id: plain.id,
2929
- date: moment__default["default"](plain.timestamp * 1000).toDate(),
2972
+ date: moment__default['default'](plain.timestamp * 1000).toDate(),
2930
2973
  duration: plain.duration * 1000,
2931
2974
  caller: {
2932
2975
  name: plain.caller_id_name,
@@ -3063,7 +3106,7 @@ class Call {
3063
3106
  onHold: plain.on_hold,
3064
3107
  status: plain.status,
3065
3108
  lineId: plain.line_id,
3066
- startingTime: moment__default["default"](plain.creation_time).toDate(),
3109
+ startingTime: moment__default['default'](plain.creation_time).toDate(),
3067
3110
  talkingToIds: Object.keys(plain.talking_to || {}),
3068
3111
  recording: plain.record_state === RECORD_STATE_ACTIVE,
3069
3112
  });
@@ -3543,7 +3586,7 @@ class Emitter {
3543
3586
 
3544
3587
 
3545
3588
  constructor() {
3546
- this.eventEmitter = new EventEmitter__default["default"]();
3589
+ this.eventEmitter = new EventEmitter__default['default']();
3547
3590
  }
3548
3591
 
3549
3592
  on(event , callback ) {
@@ -3588,7 +3631,7 @@ class Recording {
3588
3631
 
3589
3632
 
3590
3633
 
3591
- static parseMany(recordings ) {
3634
+ static parseMany(recordings = []) {
3592
3635
  return recordings.map(item => Recording.parse(item));
3593
3636
  }
3594
3637
 
@@ -3596,8 +3639,8 @@ class Recording {
3596
3639
  return new Recording({
3597
3640
  deleted: plain.deleted,
3598
3641
  fileName: plain.filename,
3599
- end: plain.end_time ? moment__default["default"](plain.end_time).toDate() : null,
3600
- start: moment__default["default"](plain.start_time).toDate(),
3642
+ end: plain.end_time ? moment__default['default'](plain.end_time).toDate() : null,
3643
+ start: moment__default['default'](plain.start_time).toDate(),
3601
3644
  uuid: plain.uuid,
3602
3645
  });
3603
3646
  }
@@ -3695,7 +3738,7 @@ class CallLog {
3695
3738
 
3696
3739
  static parse(plain ) {
3697
3740
  return new CallLog({
3698
- answer: plain.answer ? moment__default["default"](plain.answer).toDate() : null,
3741
+ answer: plain.answer ? moment__default['default'](plain.answer).toDate() : null,
3699
3742
  answered: plain.answered,
3700
3743
  callDirection: plain.call_direction,
3701
3744
  destination: {
@@ -3712,9 +3755,9 @@ class CallLog {
3712
3755
  },
3713
3756
  id: plain.id,
3714
3757
  duration: (plain.duration || 0) * 1000, // duration is in seconds
3715
- start: moment__default["default"](plain.start).toDate(),
3716
- end: plain.end ? moment__default["default"](plain.end).toDate() : null,
3717
- recordings: Recording.parseMany(plain.recordings),
3758
+ start: moment__default['default'](plain.start).toDate(),
3759
+ end: plain.end ? moment__default['default'](plain.end).toDate() : null,
3760
+ recordings: Recording.parseMany(plain.recordings || []),
3718
3761
  });
3719
3762
  }
3720
3763
 
@@ -5888,7 +5931,7 @@ const parseCandidate$1 = (candidate ) => {
5888
5931
  if (!candidate) {
5889
5932
  return null;
5890
5933
  }
5891
- const result = sdpParser__default["default"].parse(candidate.indexOf('a=') === 0 ? candidate : `a=${candidate}`);
5934
+ const result = sdpParser__default['default'].parse(candidate.indexOf('a=') === 0 ? candidate : `a=${candidate}`);
5892
5935
 
5893
5936
  return result.candidates ? result.candidates[0] : null;
5894
5937
  };
@@ -5902,7 +5945,7 @@ const areCandidateValid = (candidates ) =>
5902
5945
  .length > 0;
5903
5946
 
5904
5947
  const getVideoDirection = (sdp ) => {
5905
- const parsedSdp = sdpParser__default["default"].parse(sdp);
5948
+ const parsedSdp = sdpParser__default['default'].parse(sdp);
5906
5949
  const videoMedia = parsedSdp.media.find(media => media.type === 'video');
5907
5950
  if (!videoMedia) {
5908
5951
  return null;
@@ -5916,14 +5959,14 @@ const hasAnActiveVideo = (sdp ) => {
5916
5959
  return false;
5917
5960
  }
5918
5961
 
5919
- const parsedSdp = sdpParser__default["default"].parse(sdp);
5962
+ const parsedSdp = sdpParser__default['default'].parse(sdp);
5920
5963
 
5921
5964
  return !!parsedSdp.media.find(media =>
5922
5965
  media.type === 'video' && media.port > 10 && (!media.direction || media.direction !== 'inactive'));
5923
5966
  };
5924
5967
 
5925
5968
  const fixSdp = (sdp , candidates , forcePort = true) => {
5926
- const parsedSdp = sdpParser__default["default"].parse(sdp);
5969
+ const parsedSdp = sdpParser__default['default'].parse(sdp);
5927
5970
  const mainCandidate = getSrflxOrRelay(candidates)[0];
5928
5971
  const ip = mainCandidate ? mainCandidate.ip : null;
5929
5972
 
@@ -5941,7 +5984,7 @@ const fixSdp = (sdp , candidates , forcePort = true)
5941
5984
  };
5942
5985
  });
5943
5986
 
5944
- let fixed = sdpParser__default["default"].write(parsedSdp);
5987
+ let fixed = sdpParser__default['default'].write(parsedSdp);
5945
5988
 
5946
5989
  if (ip) {
5947
5990
  fixed = fixed.replace(/IN IP4 0.0.0.0/g, `IN IP4 ${ip}`);
@@ -5987,7 +6030,7 @@ class WazoSessionDescriptionHandler extends sessionDescriptionHandler.SessionDes
5987
6030
  ) {
5988
6031
  super(logger, mediaStreamFactory, sessionDescriptionHandlerConfiguration);
5989
6032
 
5990
- this.eventEmitter = new EventEmitter__default["default"]();
6033
+ this.eventEmitter = new EventEmitter__default['default']();
5991
6034
  this.isWeb = isWeb;
5992
6035
  this.session = session;
5993
6036
  }
@@ -6968,7 +7011,9 @@ class WebRTCClient extends Emitter {
6968
7011
  const inviteOptions = {
6969
7012
  requestDelegate: {
6970
7013
  onAccept: (response ) => {
6971
- session.sessionDescriptionHandler.peerConnection.sfu = conference;
7014
+ if (session.sessionDescriptionHandler.peerConnection) {
7015
+ session.sessionDescriptionHandler.peerConnection.sfu = conference;
7016
+ }
6972
7017
  this._onAccepted(session, response.session, true);
6973
7018
  },
6974
7019
  onReject: (response ) => {
@@ -7304,7 +7349,7 @@ class WebRTCClient extends Emitter {
7304
7349
  // We search for the last transceiver without `video-` in the mid (video- means remote transceiver)
7305
7350
  const transceivers = pc.getTransceivers();
7306
7351
  const transceiverIdx = lastIndexOf(transceivers, transceiver =>
7307
- transceiver.sender.track === null && transceiver.mid.indexOf('video') === -1);
7352
+ transceiver.sender.track === null && transceiver.mid && transceiver.mid.indexOf('video') === -1);
7308
7353
 
7309
7354
  videoSender = transceiverIdx !== -1 ? transceivers[transceiverIdx].sender : null;
7310
7355
  } else {
@@ -7840,6 +7885,16 @@ class WebRTCClient extends Emitter {
7840
7885
  return this.hasRemoteVideo(sessionId) ? this.getRemoteStream(sessionId) : null;
7841
7886
  }
7842
7887
 
7888
+ // Useful in a react-native environment when remoteMediaStream is not updated
7889
+ getRemoteVideoStreamFromPc(sessionId ) {
7890
+ const pc = this.getPeerConnection(sessionId);
7891
+ if (!pc) {
7892
+ return null;
7893
+ }
7894
+
7895
+ return pc.getRemoteStreams().find(stream => !!stream.getVideoTracks().length);
7896
+ }
7897
+
7843
7898
  hasVideo(sessionId ) {
7844
7899
  return this.hasLocalVideo(sessionId) || this.hasRemoteVideo(sessionId);
7845
7900
  }
@@ -8350,6 +8405,7 @@ class WebRTCClient extends Emitter {
8350
8405
  session.sessionDescriptionHandler.remoteMediaStream.onaddtrack = onTrack;
8351
8406
 
8352
8407
  pc.oniceconnectionstatechange = () => {
8408
+ logger$8.info('on ice connection state changed', { state: pc.iceConnectionState });
8353
8409
  if (pc.iceConnectionState === 'disconnected') {
8354
8410
  this.eventEmitter.emit(ON_DISCONNECTED$1);
8355
8411
  }
@@ -8509,7 +8565,7 @@ class WebRTCClient extends Emitter {
8509
8565
  }
8510
8566
  const sessionId = this.getSipSessionId(session);
8511
8567
 
8512
- getStats__default["default"](pc, (result ) => {
8568
+ getStats__default['default'](pc, (result ) => {
8513
8569
  const { results, internal, nomore, ...stats } = result;
8514
8570
  this.statsIntervals[sessionId] = nomore;
8515
8571
 
@@ -8618,18 +8674,22 @@ class WebRTCClient extends Emitter {
8618
8674
  });
8619
8675
 
8620
8676
  networkStats.packetsLost = packetsLost;
8621
- networkStats.audioBytesSent = audioBytesSent;
8677
+ networkStats.totalAudioBytesSent = audioBytesSent;
8678
+ networkStats.audioBytesSent = audioBytesSent - lastAudioSent;
8679
+ networkStats.totalAudioBytesReceived = audioBytesReceived - lastAudioReceived;
8622
8680
  networkStats.audioBytesReceived = audioBytesReceived;
8623
- networkStats.videoBytesSent = videoBytesSent;
8624
- networkStats.videoBytesReceived = videoBytesReceived;
8681
+ networkStats.totalVideoBytesSent = videoBytesSent;
8682
+ networkStats.videoBytesSent = videoBytesSent - lastVideoSent;
8683
+ networkStats.totalVideoBytesReceived = videoBytesReceived;
8684
+ networkStats.videoBytesReceived = videoBytesReceived - lastVideoReceived;
8685
+ networkStats.totalTransportSent = transportSent - lastTransportSent;
8625
8686
  networkStats.transportSent = transportSent;
8626
- networkStats.transportReceived = transportReceived;
8627
-
8628
- const bandwidth = (networkStats.audioBytesSent - lastAudioSent) + (networkStats.videoBytesSent - lastVideoSent)
8629
- + (networkStats.audioBytesReceived - lastAudioReceived) + (networkStats.videoBytesReceived - lastVideoReceived)
8630
- + (networkStats.transportReceived - lastTransportReceived) + (networkStats.transportSent - lastTransportSent);
8687
+ networkStats.totalTransportReceived = transportReceived;
8688
+ networkStats.transportReceived = transportReceived - lastTransportReceived;
8631
8689
 
8632
- networkStats.bandwidth = bandwidth;
8690
+ networkStats.bandwidth = networkStats.audioBytesSent + networkStats.audioBytesReceived
8691
+ + networkStats.videoBytesSent + networkStats.videoBytesReceived + networkStats.transportReceived
8692
+ + networkStats.transportSent;
8633
8693
 
8634
8694
  this.eventEmitter.emit(ON_NETWORK_STATS$1, session, networkStats, this.sessionNetworkStats[sessionId]);
8635
8695
  this.sessionNetworkStats[sessionId].push(networkStats);
@@ -9011,7 +9071,10 @@ class WebRTCPhone extends Emitter {
9011
9071
 
9012
9072
  onCancel(message);
9013
9073
  const elsewhere = message.data.indexOf('cause=26') !== -1 && message.data.indexOf('completed elsewhere') !== -1;
9014
- this.eventEmitter.emit(ON_CALL_CANCELED, this._createCallSession(sipSession), elsewhere);
9074
+ const callSession = this._createCallSession(sipSession);
9075
+ delete this.callSessions[callSession.getId()];
9076
+
9077
+ this.eventEmitter.emit(ON_CALL_CANCELED, callSession, elsewhere);
9015
9078
  };
9016
9079
  } else if (sipSession instanceof invitation.Invitation) {
9017
9080
  console.warn('sipSession._onCancel not found, please update the wazo SDK accordingly');
@@ -9040,9 +9103,11 @@ class WebRTCPhone extends Emitter {
9040
9103
  case sessionState.SessionState.Terminated: {
9041
9104
  logger$7.info('WebRTC phone - call terminated', { sipId: sipSession.id });
9042
9105
 
9106
+ // Should be called before `_onCallTerminated` or the callCount will not decrement...
9107
+ const callSession = this._createCallSession(sipSession);
9043
9108
  const wasCurrentSession = this._onCallTerminated(sipSession);
9044
9109
 
9045
- return this.eventEmitter.emit(ON_CALL_ENDED, this._createCallSession(sipSession), wasCurrentSession);
9110
+ return this.eventEmitter.emit(ON_CALL_ENDED, callSession, wasCurrentSession);
9046
9111
  }
9047
9112
  }
9048
9113
  });
@@ -9990,6 +10055,10 @@ class WebRTCPhone extends Emitter {
9990
10055
  return callSession ? this.client.getRemoteVideoStream(callSession.sipCallId) : null;
9991
10056
  }
9992
10057
 
10058
+ getRemoteVideoStreamFromPc(callSession ) {
10059
+ return callSession ? this.client.getRemoteVideoStreamFromPc(callSession.sipCallId) : null;
10060
+ }
10061
+
9993
10062
  hasRemoteVideo(callSession ) {
9994
10063
  return callSession ? this.client.hasRemoteVideo(callSession.sipCallId) : false;
9995
10064
  }
@@ -10673,6 +10742,11 @@ class Phone extends Emitter {
10673
10742
  return this.getRemoteVideoStream(callSession);
10674
10743
  }
10675
10744
 
10745
+ // Useful in a react-native environment when remoteMediaStream is not updated
10746
+ getRemoteVideoStreamFromPc(callSession ) {
10747
+ return this.phone ? this.phone.getRemoteVideoStreamFromPc(callSession) : false;
10748
+ }
10749
+
10676
10750
  hasVideo(callSession ) {
10677
10751
  return this.phone ? this.phone.hasVideo(callSession) : false;
10678
10752
  }
@@ -10832,6 +10906,7 @@ const AGENT_PAUSED = 'agent_paused';
10832
10906
  const AGENT_UNPAUSED = 'agent_unpaused';
10833
10907
  const CONFERENCE_ADHOC_PARTICIPANT_LEFT = 'conference_adhoc_participant_left';
10834
10908
  const CONFERENCE_ADHOC_DELETED = 'conference_adhoc_deleted';
10909
+ const MEETING_USER_PROGRESS = 'meeting_user_progress';
10835
10910
 
10836
10911
  const BLACKLIST_EVENTS = [
10837
10912
  CHAT_MESSAGE_SENT,
@@ -10891,7 +10966,7 @@ class WebSocketClient extends Emitter {
10891
10966
 
10892
10967
  connect() {
10893
10968
  logger$5.info('connect method started', { host: this.host, token: this.token });
10894
- this.socket = new ReconnectingWebSocket__default["default"](this._getUrl.bind(this), [], this.options);
10969
+ this.socket = new ReconnectingWebSocket__default['default'](this._getUrl.bind(this), [], this.options);
10895
10970
  if (this.options.binaryType) {
10896
10971
  this.socket.binaryType = this.options.binaryType;
10897
10972
  }
@@ -11182,6 +11257,7 @@ WebSocketClient.eventLists = [
11182
11257
  AGENT_UNPAUSED,
11183
11258
  CONFERENCE_ADHOC_PARTICIPANT_LEFT,
11184
11259
  CONFERENCE_ADHOC_DELETED,
11260
+ MEETING_USER_PROGRESS,
11185
11261
  ];
11186
11262
 
11187
11263
  var WebSocketClient$1 = /*#__PURE__*/Object.freeze({
@@ -11252,6 +11328,7 @@ var WebSocketClient$1 = /*#__PURE__*/Object.freeze({
11252
11328
  AGENT_UNPAUSED: AGENT_UNPAUSED,
11253
11329
  CONFERENCE_ADHOC_PARTICIPANT_LEFT: CONFERENCE_ADHOC_PARTICIPANT_LEFT,
11254
11330
  CONFERENCE_ADHOC_DELETED: CONFERENCE_ADHOC_DELETED,
11331
+ MEETING_USER_PROGRESS: MEETING_USER_PROGRESS,
11255
11332
  HEARTBEAT_ENGINE_VERSION: HEARTBEAT_ENGINE_VERSION,
11256
11333
  'default': WebSocketClient
11257
11334
  });
@@ -12144,7 +12221,7 @@ class Room$1 extends Emitter {
12144
12221
  }
12145
12222
 
12146
12223
  _mapMsid(rawSdp ) {
12147
- const sdp = sdpParser__default["default"].parse(rawSdp);
12224
+ const sdp = sdpParser__default['default'].parse(rawSdp);
12148
12225
  const labelMsidArray = sdp.media.filter(media => !!media.label).map(({ label, msid }) => ({
12149
12226
  label: String(label),
12150
12227
  streamId: msid.split(' ')[0],
@@ -12,7 +12,7 @@ class Emitter {
12
12
 
13
13
 
14
14
  constructor() {
15
- this.eventEmitter = new EventEmitter__default["default"]();
15
+ this.eventEmitter = new EventEmitter__default['default']();
16
16
  }
17
17
 
18
18
  on(event , callback ) {
@@ -10,8 +10,8 @@ var LibPhoneNumber__default = /*#__PURE__*/_interopDefaultLegacy(LibPhoneNumber)
10
10
 
11
11
  //
12
12
 
13
- const PhoneNumberUtil = LibPhoneNumber__default["default"].PhoneNumberUtil.getInstance();
14
- const { PhoneNumberFormat, AsYouTypeFormatter } = LibPhoneNumber__default["default"];
13
+ const PhoneNumberUtil = LibPhoneNumber__default['default'].PhoneNumberUtil.getInstance();
14
+ const { PhoneNumberFormat, AsYouTypeFormatter } = LibPhoneNumber__default['default'];
15
15
 
16
16
  // eslint-disable-next-line
17
17
  const EXTRA_CHAR_REGEXP = /[^+*\d]/g;
@@ -8,8 +8,8 @@ var LibPhoneNumber__default = /*#__PURE__*/_interopDefaultLegacy(LibPhoneNumber)
8
8
 
9
9
  //
10
10
 
11
- const PhoneNumberUtil = LibPhoneNumber__default["default"].PhoneNumberUtil.getInstance();
12
- const { PhoneNumberFormat, AsYouTypeFormatter } = LibPhoneNumber__default["default"];
11
+ const PhoneNumberUtil = LibPhoneNumber__default['default'].PhoneNumberUtil.getInstance();
12
+ const { PhoneNumberFormat, AsYouTypeFormatter } = LibPhoneNumber__default['default'];
13
13
 
14
14
  // eslint-disable-next-line
15
15
  const EXTRA_CHAR_REGEXP = /[^+*\d]/g;
@@ -132,6 +132,7 @@ class IssueReporter {
132
132
 
133
133
 
134
134
 
135
+
135
136
 
136
137
  constructor() {
137
138
  addLevelsTo(this);
@@ -143,12 +144,17 @@ class IssueReporter {
143
144
  this.bufferTimeout = null;
144
145
  this._boundProcessBuffer = this._processBuffer.bind(this);
145
146
  this._boundParseLoggerBody = this._parseLoggerBody.bind(this);
147
+ this._callback = null;
146
148
  }
147
149
 
148
150
  init() {
149
151
  this._catchConsole();
150
152
  }
151
153
 
154
+ setCallback(cb ) {
155
+ this._callback = cb;
156
+ }
157
+
152
158
  configureRemoteClient(configuration = { tag: 'wazo-sdk', host: null, port: null, level: null, extra: {} }) {
153
159
  this.remoteClientConfiguration = configuration;
154
160
  }
@@ -184,6 +190,7 @@ class IssueReporter {
184
190
 
185
191
  // Handle category label
186
192
  let category = null;
193
+ let skipSendToRemote = false;
187
194
  let extra = {};
188
195
  if (args[0].indexOf(CATEGORY_PREFIX) === 0) {
189
196
  category = args[0].split('=')[1];
@@ -199,6 +206,7 @@ class IssueReporter {
199
206
  errorMessage: lastArg.message,
200
207
  errorStack: lastArg.stack,
201
208
  errorType: lastArg.constructor.name,
209
+ skipSendToRemote: lastArg.skipSendToRemote,
202
210
  };
203
211
  } else {
204
212
  extra = lastArg;
@@ -207,7 +215,12 @@ class IssueReporter {
207
215
  args.splice(1, 1);
208
216
  }
209
217
 
210
- const date = moment__default["default"]().format('YYYY-MM-DD HH:mm:ss.SSS');
218
+ if (extra.skipSendToRemote) {
219
+ skipSendToRemote = true;
220
+ delete extra.skipSendToRemote;
221
+ }
222
+
223
+ const date = moment__default['default']().format('YYYY-MM-DD HH:mm:ss.SSS');
211
224
  const message = args.join(', ');
212
225
  let consoleMessage = message;
213
226
 
@@ -227,7 +240,13 @@ class IssueReporter {
227
240
  const oldMethod = this.oldConsoleMethods[consoleLevel] || this.oldConsoleMethods.log;
228
241
  oldMethod.apply(oldMethod, [date, consoleMessage]);
229
242
 
230
- this._sendToRemoteLogger(level, { date, message, category, ...extra });
243
+ if (this._callback) {
244
+ this._callback(level, consoleMessage);
245
+ }
246
+
247
+ if (!skipSendToRemote) {
248
+ this._sendToRemoteLogger(level, { date, message, category, ...extra });
249
+ }
231
250
  }
232
251
 
233
252
  logRequest(url , options , response , start ) {
@@ -372,7 +391,11 @@ class IssueReporter {
372
391
  },
373
392
  // $FlowFixMe
374
393
  body,
375
- }).catch(() => {
394
+ }).catch((e ) => {
395
+ // $FlowFixMe
396
+ e.skipSendToRemote = true;
397
+ this.log('error', this._makeCategory('grafana'), 'Sending log to grafana, error', e);
398
+
376
399
  setTimeout(() => {
377
400
  if (isArray) {
378
401
  payload = payload.map(message => {
@@ -384,7 +407,7 @@ class IssueReporter {
384
407
  payload._retry = retry + 1;
385
408
  }
386
409
 
387
- this._sendDebugToGrafana(body, retry + 1);
410
+ this._sendDebugToGrafana(payload, retry + 1);
388
411
  }, 5000 + retry * 1000);
389
412
  });
390
413
  }
@@ -13,7 +13,7 @@ const getCandidates = (rawSdp ) => {
13
13
  return [];
14
14
  }
15
15
 
16
- const sdp = sdpParser__default["default"].parse(rawSdp);
16
+ const sdp = sdpParser__default['default'].parse(rawSdp);
17
17
  if (!sdp || !sdp.media) {
18
18
  return [];
19
19
  }
@@ -25,7 +25,7 @@ const parseCandidate = (candidate ) => {
25
25
  if (!candidate) {
26
26
  return null;
27
27
  }
28
- const result = sdpParser__default["default"].parse(candidate.indexOf('a=') === 0 ? candidate : `a=${candidate}`);
28
+ const result = sdpParser__default['default'].parse(candidate.indexOf('a=') === 0 ? candidate : `a=${candidate}`);
29
29
 
30
30
  return result.candidates ? result.candidates[0] : null;
31
31
  };
@@ -45,24 +45,24 @@ const isSdpValid = (sdp ) => {
45
45
  };
46
46
 
47
47
  const fixBundle = (sdp ) => {
48
- const parsedSdp = sdpParser__default["default"].parse(sdp);
48
+ const parsedSdp = sdpParser__default['default'].parse(sdp);
49
49
  const bundleIndex = parsedSdp.groups.findIndex(group => group.type === 'BUNDLE');
50
50
  if (bundleIndex !== -1) {
51
51
  parsedSdp.groups[bundleIndex].mids = parsedSdp.media
52
52
  .map((media, index) => ('mid' in media ? media.mid : index)).join(' ');
53
53
  }
54
54
 
55
- return sdpParser__default["default"].write(parsedSdp);
55
+ return sdpParser__default['default'].write(parsedSdp);
56
56
  };
57
57
 
58
58
  const toggleVideoDirection = (sdp , direction ) => {
59
- const parsedSdp = sdpParser__default["default"].parse(sdp);
59
+ const parsedSdp = sdpParser__default['default'].parse(sdp);
60
60
  parsedSdp.media = parsedSdp.media.map(media => ({
61
61
  ...media,
62
62
  ...(media.type === 'video' ? { direction } : {}),
63
63
  }));
64
64
 
65
- return sdpParser__default["default"].write(parsedSdp);
65
+ return sdpParser__default['default'].write(parsedSdp);
66
66
  };
67
67
 
68
68
  const hasAnActiveVideo = (sdp ) => {
@@ -70,14 +70,14 @@ const hasAnActiveVideo = (sdp ) => {
70
70
  return false;
71
71
  }
72
72
 
73
- const parsedSdp = sdpParser__default["default"].parse(sdp);
73
+ const parsedSdp = sdpParser__default['default'].parse(sdp);
74
74
 
75
75
  return !!parsedSdp.media.find(media =>
76
76
  media.type === 'video' && media.port > 10 && (!media.direction || media.direction !== 'inactive'));
77
77
  };
78
78
 
79
79
  const fixSdp = (sdp , candidates , forcePort = true) => {
80
- const parsedSdp = sdpParser__default["default"].parse(sdp);
80
+ const parsedSdp = sdpParser__default['default'].parse(sdp);
81
81
  const mainCandidate = getSrflxOrRelay(candidates)[0];
82
82
  const ip = mainCandidate ? mainCandidate.ip : null;
83
83
 
@@ -95,7 +95,7 @@ const fixSdp = (sdp , candidates , forcePort = true)
95
95
  };
96
96
  });
97
97
 
98
- let fixed = sdpParser__default["default"].write(parsedSdp);
98
+ let fixed = sdpParser__default['default'].write(parsedSdp);
99
99
 
100
100
  if (ip) {
101
101
  fixed = fixed.replace(/IN IP4 0.0.0.0/g, `IN IP4 ${ip}`);
@@ -234,7 +234,7 @@ describe('SDP utils', () => {
234
234
  const candidates = [parseCandidate(candidate)];
235
235
 
236
236
  const fixedSdp = fixSdp(badMobileSdp, candidates);
237
- const parsed = sdpParser__default["default"].parse(fixedSdp);
237
+ const parsed = sdpParser__default['default'].parse(fixedSdp);
238
238
 
239
239
  expect(parsed.media[0].candidates.length).toBe(1);
240
240
  expect(parsed.media[0].port).toBe(57021);
@@ -246,7 +246,7 @@ describe('SDP utils', () => {
246
246
  describe('Fixing group bundle', () => {
247
247
  it('should set a bundle for each m section', async () => {
248
248
  const invalid = fixBundle(invalidBundle);
249
- const parsed = sdpParser__default["default"].parse(invalid);
249
+ const parsed = sdpParser__default['default'].parse(invalid);
250
250
 
251
251
  expect(parsed.groups[0].mids).toBe('0 1');
252
252
  });
@@ -255,7 +255,7 @@ describe('SDP utils', () => {
255
255
  describe('Deactivate video', () => {
256
256
  it('should set inactive to each video sections', async () => {
257
257
  const sdp = toggleVideoDirection(videoReinvite, 'inactive');
258
- const parsed = sdpParser__default["default"].parse(sdp);
258
+ const parsed = sdpParser__default['default'].parse(sdp);
259
259
 
260
260
  expect(parsed.media[1].direction).toBe('inactive');
261
261
  expect(parsed.media[2].direction).toBe('inactive');