@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
@@ -1644,6 +1644,7 @@ class IssueReporter {
1644
1644
 
1645
1645
 
1646
1646
 
1647
+
1647
1648
 
1648
1649
  constructor() {
1649
1650
  addLevelsTo(this);
@@ -1655,12 +1656,17 @@ class IssueReporter {
1655
1656
  this.bufferTimeout = null;
1656
1657
  this._boundProcessBuffer = this._processBuffer.bind(this);
1657
1658
  this._boundParseLoggerBody = this._parseLoggerBody.bind(this);
1659
+ this._callback = null;
1658
1660
  }
1659
1661
 
1660
1662
  init() {
1661
1663
  this._catchConsole();
1662
1664
  }
1663
1665
 
1666
+ setCallback(cb ) {
1667
+ this._callback = cb;
1668
+ }
1669
+
1664
1670
  configureRemoteClient(configuration = { tag: 'wazo-sdk', host: null, port: null, level: null, extra: {} }) {
1665
1671
  this.remoteClientConfiguration = configuration;
1666
1672
  }
@@ -1696,6 +1702,7 @@ class IssueReporter {
1696
1702
 
1697
1703
  // Handle category label
1698
1704
  let category = null;
1705
+ let skipSendToRemote = false;
1699
1706
  let extra = {};
1700
1707
  if (args[0].indexOf(CATEGORY_PREFIX) === 0) {
1701
1708
  category = args[0].split('=')[1];
@@ -1711,6 +1718,7 @@ class IssueReporter {
1711
1718
  errorMessage: lastArg.message,
1712
1719
  errorStack: lastArg.stack,
1713
1720
  errorType: lastArg.constructor.name,
1721
+ skipSendToRemote: lastArg.skipSendToRemote,
1714
1722
  };
1715
1723
  } else {
1716
1724
  extra = lastArg;
@@ -1719,7 +1727,12 @@ class IssueReporter {
1719
1727
  args.splice(1, 1);
1720
1728
  }
1721
1729
 
1722
- const date = moment__default["default"]().format('YYYY-MM-DD HH:mm:ss.SSS');
1730
+ if (extra.skipSendToRemote) {
1731
+ skipSendToRemote = true;
1732
+ delete extra.skipSendToRemote;
1733
+ }
1734
+
1735
+ const date = moment__default['default']().format('YYYY-MM-DD HH:mm:ss.SSS');
1723
1736
  const message = args.join(', ');
1724
1737
  let consoleMessage = message;
1725
1738
 
@@ -1739,7 +1752,13 @@ class IssueReporter {
1739
1752
  const oldMethod = this.oldConsoleMethods[consoleLevel] || this.oldConsoleMethods.log;
1740
1753
  oldMethod.apply(oldMethod, [date, consoleMessage]);
1741
1754
 
1742
- this._sendToRemoteLogger(level, { date, message, category, ...extra });
1755
+ if (this._callback) {
1756
+ this._callback(level, consoleMessage);
1757
+ }
1758
+
1759
+ if (!skipSendToRemote) {
1760
+ this._sendToRemoteLogger(level, { date, message, category, ...extra });
1761
+ }
1743
1762
  }
1744
1763
 
1745
1764
  logRequest(url , options , response , start ) {
@@ -1884,7 +1903,11 @@ class IssueReporter {
1884
1903
  },
1885
1904
  // $FlowFixMe
1886
1905
  body,
1887
- }).catch(() => {
1906
+ }).catch((e ) => {
1907
+ // $FlowFixMe
1908
+ e.skipSendToRemote = true;
1909
+ this.log('error', this._makeCategory('grafana'), 'Sending log to grafana, error', e);
1910
+
1888
1911
  setTimeout(() => {
1889
1912
  if (isArray) {
1890
1913
  payload = payload.map(message => {
@@ -1896,7 +1919,7 @@ class IssueReporter {
1896
1919
  payload._retry = retry + 1;
1897
1920
  }
1898
1921
 
1899
- this._sendDebugToGrafana(body, retry + 1);
1922
+ this._sendDebugToGrafana(payload, retry + 1);
1900
1923
  }, 5000 + retry * 1000);
1901
1924
  });
1902
1925
  }
@@ -2614,7 +2637,8 @@ class ExternalApp {
2614
2637
 
2615
2638
 
2616
2639
 
2617
-
2640
+
2641
+
2618
2642
 
2619
2643
 
2620
2644
  class Meeting {
@@ -2626,6 +2650,7 @@ class Meeting {
2626
2650
 
2627
2651
 
2628
2652
 
2653
+
2629
2654
 
2630
2655
 
2631
2656
  static parse(plain ) {
@@ -2637,14 +2662,28 @@ class Meeting {
2637
2662
  port: plain.port,
2638
2663
  uuid: plain.uuid,
2639
2664
  number: plain.number,
2665
+ persistent: plain.persistent,
2640
2666
  });
2641
2667
  }
2642
2668
 
2669
+ static parseMany(items ) {
2670
+ return items.map(plain => Meeting.parse(plain));
2671
+ }
2672
+
2643
2673
  static newFrom(meeting ) {
2644
2674
  return newFrom(meeting, Meeting);
2645
2675
  }
2646
2676
 
2647
- constructor({ uuid, name, guestSipAuthorization, ownerUuids, port, uri, number } = {}) {
2677
+ constructor({
2678
+ uuid,
2679
+ name,
2680
+ guestSipAuthorization,
2681
+ ownerUuids,
2682
+ port,
2683
+ uri,
2684
+ number,
2685
+ persistent,
2686
+ } = {}) {
2648
2687
  this.guestSipAuthorization = guestSipAuthorization;
2649
2688
  this.uri = uri;
2650
2689
  this.name = name;
@@ -2652,6 +2691,7 @@ class Meeting {
2652
2691
  this.port = port;
2653
2692
  this.uuid = uuid;
2654
2693
  this.number = number;
2694
+ this.persistent = persistent;
2655
2695
 
2656
2696
  // Useful to compare instead of instanceof with minified code
2657
2697
  this.type = 'Meeting';
@@ -2729,8 +2769,11 @@ var confdMethods = (client , baseUrl ) => ({
2729
2769
  }
2730
2770
  },
2731
2771
 
2732
- createMyMeeting: (name ) =>
2733
- client.post(`${baseUrl}/users/me/meetings`, { name }).then(Meeting.parse),
2772
+ getMyMeetings: () =>
2773
+ client.get(`${baseUrl}/users/me/meetings`).then(response => Meeting.parseMany(response.items)),
2774
+
2775
+ createMyMeeting: (name , persistent ) =>
2776
+ client.post(`${baseUrl}/users/me/meetings`, { name, persistent }).then(Meeting.parse),
2734
2777
 
2735
2778
  deleteMyMeeting: (meetingUuid ) =>
2736
2779
  client.delete(`${baseUrl}/users/me/meetings/${meetingUuid}`, null),
@@ -2832,7 +2875,7 @@ class ChatMessage {
2832
2875
  static parse(plain ) {
2833
2876
  return new ChatMessage({
2834
2877
  uuid: plain.uuid,
2835
- date: moment__default["default"](plain.created_at).toDate(),
2878
+ date: moment__default['default'](plain.created_at).toDate(),
2836
2879
  content: plain.content,
2837
2880
  alias: plain.alias,
2838
2881
  userUuid: plain.user_uuid,
@@ -2924,7 +2967,7 @@ class Voicemail {
2924
2967
  static parse(plain ) {
2925
2968
  return new Voicemail({
2926
2969
  id: plain.id,
2927
- date: moment__default["default"](plain.timestamp * 1000).toDate(),
2970
+ date: moment__default['default'](plain.timestamp * 1000).toDate(),
2928
2971
  duration: plain.duration * 1000,
2929
2972
  caller: {
2930
2973
  name: plain.caller_id_name,
@@ -3061,7 +3104,7 @@ class Call {
3061
3104
  onHold: plain.on_hold,
3062
3105
  status: plain.status,
3063
3106
  lineId: plain.line_id,
3064
- startingTime: moment__default["default"](plain.creation_time).toDate(),
3107
+ startingTime: moment__default['default'](plain.creation_time).toDate(),
3065
3108
  talkingToIds: Object.keys(plain.talking_to || {}),
3066
3109
  recording: plain.record_state === RECORD_STATE_ACTIVE,
3067
3110
  });
@@ -3541,7 +3584,7 @@ class Emitter {
3541
3584
 
3542
3585
 
3543
3586
  constructor() {
3544
- this.eventEmitter = new EventEmitter__default["default"]();
3587
+ this.eventEmitter = new EventEmitter__default['default']();
3545
3588
  }
3546
3589
 
3547
3590
  on(event , callback ) {
@@ -3586,7 +3629,7 @@ class Recording {
3586
3629
 
3587
3630
 
3588
3631
 
3589
- static parseMany(recordings ) {
3632
+ static parseMany(recordings = []) {
3590
3633
  return recordings.map(item => Recording.parse(item));
3591
3634
  }
3592
3635
 
@@ -3594,8 +3637,8 @@ class Recording {
3594
3637
  return new Recording({
3595
3638
  deleted: plain.deleted,
3596
3639
  fileName: plain.filename,
3597
- end: plain.end_time ? moment__default["default"](plain.end_time).toDate() : null,
3598
- start: moment__default["default"](plain.start_time).toDate(),
3640
+ end: plain.end_time ? moment__default['default'](plain.end_time).toDate() : null,
3641
+ start: moment__default['default'](plain.start_time).toDate(),
3599
3642
  uuid: plain.uuid,
3600
3643
  });
3601
3644
  }
@@ -3693,7 +3736,7 @@ class CallLog {
3693
3736
 
3694
3737
  static parse(plain ) {
3695
3738
  return new CallLog({
3696
- answer: plain.answer ? moment__default["default"](plain.answer).toDate() : null,
3739
+ answer: plain.answer ? moment__default['default'](plain.answer).toDate() : null,
3697
3740
  answered: plain.answered,
3698
3741
  callDirection: plain.call_direction,
3699
3742
  destination: {
@@ -3710,9 +3753,9 @@ class CallLog {
3710
3753
  },
3711
3754
  id: plain.id,
3712
3755
  duration: (plain.duration || 0) * 1000, // duration is in seconds
3713
- start: moment__default["default"](plain.start).toDate(),
3714
- end: plain.end ? moment__default["default"](plain.end).toDate() : null,
3715
- recordings: Recording.parseMany(plain.recordings),
3756
+ start: moment__default['default'](plain.start).toDate(),
3757
+ end: plain.end ? moment__default['default'](plain.end).toDate() : null,
3758
+ recordings: Recording.parseMany(plain.recordings || []),
3716
3759
  });
3717
3760
  }
3718
3761
 
@@ -5622,7 +5665,7 @@ const parseCandidate$1 = (candidate ) => {
5622
5665
  if (!candidate) {
5623
5666
  return null;
5624
5667
  }
5625
- const result = sdpParser__default["default"].parse(candidate.indexOf('a=') === 0 ? candidate : `a=${candidate}`);
5668
+ const result = sdpParser__default['default'].parse(candidate.indexOf('a=') === 0 ? candidate : `a=${candidate}`);
5626
5669
 
5627
5670
  return result.candidates ? result.candidates[0] : null;
5628
5671
  };
@@ -5636,7 +5679,7 @@ const areCandidateValid = (candidates ) =>
5636
5679
  .length > 0;
5637
5680
 
5638
5681
  const getVideoDirection = (sdp ) => {
5639
- const parsedSdp = sdpParser__default["default"].parse(sdp);
5682
+ const parsedSdp = sdpParser__default['default'].parse(sdp);
5640
5683
  const videoMedia = parsedSdp.media.find(media => media.type === 'video');
5641
5684
  if (!videoMedia) {
5642
5685
  return null;
@@ -5650,14 +5693,14 @@ const hasAnActiveVideo = (sdp ) => {
5650
5693
  return false;
5651
5694
  }
5652
5695
 
5653
- const parsedSdp = sdpParser__default["default"].parse(sdp);
5696
+ const parsedSdp = sdpParser__default['default'].parse(sdp);
5654
5697
 
5655
5698
  return !!parsedSdp.media.find(media =>
5656
5699
  media.type === 'video' && media.port > 10 && (!media.direction || media.direction !== 'inactive'));
5657
5700
  };
5658
5701
 
5659
5702
  const fixSdp = (sdp , candidates , forcePort = true) => {
5660
- const parsedSdp = sdpParser__default["default"].parse(sdp);
5703
+ const parsedSdp = sdpParser__default['default'].parse(sdp);
5661
5704
  const mainCandidate = getSrflxOrRelay(candidates)[0];
5662
5705
  const ip = mainCandidate ? mainCandidate.ip : null;
5663
5706
 
@@ -5675,7 +5718,7 @@ const fixSdp = (sdp , candidates , forcePort = true)
5675
5718
  };
5676
5719
  });
5677
5720
 
5678
- let fixed = sdpParser__default["default"].write(parsedSdp);
5721
+ let fixed = sdpParser__default['default'].write(parsedSdp);
5679
5722
 
5680
5723
  if (ip) {
5681
5724
  fixed = fixed.replace(/IN IP4 0.0.0.0/g, `IN IP4 ${ip}`);
@@ -5721,7 +5764,7 @@ class WazoSessionDescriptionHandler extends sessionDescriptionHandler.SessionDes
5721
5764
  ) {
5722
5765
  super(logger, mediaStreamFactory, sessionDescriptionHandlerConfiguration);
5723
5766
 
5724
- this.eventEmitter = new EventEmitter__default["default"]();
5767
+ this.eventEmitter = new EventEmitter__default['default']();
5725
5768
  this.isWeb = isWeb;
5726
5769
  this.session = session;
5727
5770
  }
@@ -6702,7 +6745,9 @@ class WebRTCClient extends Emitter {
6702
6745
  const inviteOptions = {
6703
6746
  requestDelegate: {
6704
6747
  onAccept: (response ) => {
6705
- session.sessionDescriptionHandler.peerConnection.sfu = conference;
6748
+ if (session.sessionDescriptionHandler.peerConnection) {
6749
+ session.sessionDescriptionHandler.peerConnection.sfu = conference;
6750
+ }
6706
6751
  this._onAccepted(session, response.session, true);
6707
6752
  },
6708
6753
  onReject: (response ) => {
@@ -7038,7 +7083,7 @@ class WebRTCClient extends Emitter {
7038
7083
  // We search for the last transceiver without `video-` in the mid (video- means remote transceiver)
7039
7084
  const transceivers = pc.getTransceivers();
7040
7085
  const transceiverIdx = lastIndexOf(transceivers, transceiver =>
7041
- transceiver.sender.track === null && transceiver.mid.indexOf('video') === -1);
7086
+ transceiver.sender.track === null && transceiver.mid && transceiver.mid.indexOf('video') === -1);
7042
7087
 
7043
7088
  videoSender = transceiverIdx !== -1 ? transceivers[transceiverIdx].sender : null;
7044
7089
  } else {
@@ -7574,6 +7619,16 @@ class WebRTCClient extends Emitter {
7574
7619
  return this.hasRemoteVideo(sessionId) ? this.getRemoteStream(sessionId) : null;
7575
7620
  }
7576
7621
 
7622
+ // Useful in a react-native environment when remoteMediaStream is not updated
7623
+ getRemoteVideoStreamFromPc(sessionId ) {
7624
+ const pc = this.getPeerConnection(sessionId);
7625
+ if (!pc) {
7626
+ return null;
7627
+ }
7628
+
7629
+ return pc.getRemoteStreams().find(stream => !!stream.getVideoTracks().length);
7630
+ }
7631
+
7577
7632
  hasVideo(sessionId ) {
7578
7633
  return this.hasLocalVideo(sessionId) || this.hasRemoteVideo(sessionId);
7579
7634
  }
@@ -8084,6 +8139,7 @@ class WebRTCClient extends Emitter {
8084
8139
  session.sessionDescriptionHandler.remoteMediaStream.onaddtrack = onTrack;
8085
8140
 
8086
8141
  pc.oniceconnectionstatechange = () => {
8142
+ logger$9.info('on ice connection state changed', { state: pc.iceConnectionState });
8087
8143
  if (pc.iceConnectionState === 'disconnected') {
8088
8144
  this.eventEmitter.emit(ON_DISCONNECTED$1);
8089
8145
  }
@@ -8243,7 +8299,7 @@ class WebRTCClient extends Emitter {
8243
8299
  }
8244
8300
  const sessionId = this.getSipSessionId(session);
8245
8301
 
8246
- getStats__default["default"](pc, (result ) => {
8302
+ getStats__default['default'](pc, (result ) => {
8247
8303
  const { results, internal, nomore, ...stats } = result;
8248
8304
  this.statsIntervals[sessionId] = nomore;
8249
8305
 
@@ -8352,18 +8408,22 @@ class WebRTCClient extends Emitter {
8352
8408
  });
8353
8409
 
8354
8410
  networkStats.packetsLost = packetsLost;
8355
- networkStats.audioBytesSent = audioBytesSent;
8411
+ networkStats.totalAudioBytesSent = audioBytesSent;
8412
+ networkStats.audioBytesSent = audioBytesSent - lastAudioSent;
8413
+ networkStats.totalAudioBytesReceived = audioBytesReceived - lastAudioReceived;
8356
8414
  networkStats.audioBytesReceived = audioBytesReceived;
8357
- networkStats.videoBytesSent = videoBytesSent;
8358
- networkStats.videoBytesReceived = videoBytesReceived;
8415
+ networkStats.totalVideoBytesSent = videoBytesSent;
8416
+ networkStats.videoBytesSent = videoBytesSent - lastVideoSent;
8417
+ networkStats.totalVideoBytesReceived = videoBytesReceived;
8418
+ networkStats.videoBytesReceived = videoBytesReceived - lastVideoReceived;
8419
+ networkStats.totalTransportSent = transportSent - lastTransportSent;
8359
8420
  networkStats.transportSent = transportSent;
8360
- networkStats.transportReceived = transportReceived;
8361
-
8362
- const bandwidth = (networkStats.audioBytesSent - lastAudioSent) + (networkStats.videoBytesSent - lastVideoSent)
8363
- + (networkStats.audioBytesReceived - lastAudioReceived) + (networkStats.videoBytesReceived - lastVideoReceived)
8364
- + (networkStats.transportReceived - lastTransportReceived) + (networkStats.transportSent - lastTransportSent);
8421
+ networkStats.totalTransportReceived = transportReceived;
8422
+ networkStats.transportReceived = transportReceived - lastTransportReceived;
8365
8423
 
8366
- networkStats.bandwidth = bandwidth;
8424
+ networkStats.bandwidth = networkStats.audioBytesSent + networkStats.audioBytesReceived
8425
+ + networkStats.videoBytesSent + networkStats.videoBytesReceived + networkStats.transportReceived
8426
+ + networkStats.transportSent;
8367
8427
 
8368
8428
  this.eventEmitter.emit(ON_NETWORK_STATS$1, session, networkStats, this.sessionNetworkStats[sessionId]);
8369
8429
  this.sessionNetworkStats[sessionId].push(networkStats);
@@ -8745,7 +8805,10 @@ class WebRTCPhone extends Emitter {
8745
8805
 
8746
8806
  onCancel(message);
8747
8807
  const elsewhere = message.data.indexOf('cause=26') !== -1 && message.data.indexOf('completed elsewhere') !== -1;
8748
- this.eventEmitter.emit(ON_CALL_CANCELED, this._createCallSession(sipSession), elsewhere);
8808
+ const callSession = this._createCallSession(sipSession);
8809
+ delete this.callSessions[callSession.getId()];
8810
+
8811
+ this.eventEmitter.emit(ON_CALL_CANCELED, callSession, elsewhere);
8749
8812
  };
8750
8813
  } else if (sipSession instanceof invitation.Invitation) {
8751
8814
  console.warn('sipSession._onCancel not found, please update the wazo SDK accordingly');
@@ -8774,9 +8837,11 @@ class WebRTCPhone extends Emitter {
8774
8837
  case sessionState.SessionState.Terminated: {
8775
8838
  logger$8.info('WebRTC phone - call terminated', { sipId: sipSession.id });
8776
8839
 
8840
+ // Should be called before `_onCallTerminated` or the callCount will not decrement...
8841
+ const callSession = this._createCallSession(sipSession);
8777
8842
  const wasCurrentSession = this._onCallTerminated(sipSession);
8778
8843
 
8779
- return this.eventEmitter.emit(ON_CALL_ENDED, this._createCallSession(sipSession), wasCurrentSession);
8844
+ return this.eventEmitter.emit(ON_CALL_ENDED, callSession, wasCurrentSession);
8780
8845
  }
8781
8846
  }
8782
8847
  });
@@ -9724,6 +9789,10 @@ class WebRTCPhone extends Emitter {
9724
9789
  return callSession ? this.client.getRemoteVideoStream(callSession.sipCallId) : null;
9725
9790
  }
9726
9791
 
9792
+ getRemoteVideoStreamFromPc(callSession ) {
9793
+ return callSession ? this.client.getRemoteVideoStreamFromPc(callSession.sipCallId) : null;
9794
+ }
9795
+
9727
9796
  hasRemoteVideo(callSession ) {
9728
9797
  return callSession ? this.client.hasRemoteVideo(callSession.sipCallId) : false;
9729
9798
  }
@@ -10407,6 +10476,11 @@ class Phone extends Emitter {
10407
10476
  return this.getRemoteVideoStream(callSession);
10408
10477
  }
10409
10478
 
10479
+ // Useful in a react-native environment when remoteMediaStream is not updated
10480
+ getRemoteVideoStreamFromPc(callSession ) {
10481
+ return this.phone ? this.phone.getRemoteVideoStreamFromPc(callSession) : false;
10482
+ }
10483
+
10410
10484
  hasVideo(callSession ) {
10411
10485
  return this.phone ? this.phone.hasVideo(callSession) : false;
10412
10486
  }
@@ -10566,6 +10640,7 @@ const AGENT_PAUSED = 'agent_paused';
10566
10640
  const AGENT_UNPAUSED = 'agent_unpaused';
10567
10641
  const CONFERENCE_ADHOC_PARTICIPANT_LEFT = 'conference_adhoc_participant_left';
10568
10642
  const CONFERENCE_ADHOC_DELETED = 'conference_adhoc_deleted';
10643
+ const MEETING_USER_PROGRESS = 'meeting_user_progress';
10569
10644
 
10570
10645
  const BLACKLIST_EVENTS = [
10571
10646
  CHAT_MESSAGE_SENT,
@@ -10625,7 +10700,7 @@ class WebSocketClient extends Emitter {
10625
10700
 
10626
10701
  connect() {
10627
10702
  logger$6.info('connect method started', { host: this.host, token: this.token });
10628
- this.socket = new ReconnectingWebSocket__default["default"](this._getUrl.bind(this), [], this.options);
10703
+ this.socket = new ReconnectingWebSocket__default['default'](this._getUrl.bind(this), [], this.options);
10629
10704
  if (this.options.binaryType) {
10630
10705
  this.socket.binaryType = this.options.binaryType;
10631
10706
  }
@@ -10916,6 +10991,7 @@ WebSocketClient.eventLists = [
10916
10991
  AGENT_UNPAUSED,
10917
10992
  CONFERENCE_ADHOC_PARTICIPANT_LEFT,
10918
10993
  CONFERENCE_ADHOC_DELETED,
10994
+ MEETING_USER_PROGRESS,
10919
10995
  ];
10920
10996
 
10921
10997
  var WebSocketClient$1 = /*#__PURE__*/Object.freeze({
@@ -10986,6 +11062,7 @@ var WebSocketClient$1 = /*#__PURE__*/Object.freeze({
10986
11062
  AGENT_UNPAUSED: AGENT_UNPAUSED,
10987
11063
  CONFERENCE_ADHOC_PARTICIPANT_LEFT: CONFERENCE_ADHOC_PARTICIPANT_LEFT,
10988
11064
  CONFERENCE_ADHOC_DELETED: CONFERENCE_ADHOC_DELETED,
11065
+ MEETING_USER_PROGRESS: MEETING_USER_PROGRESS,
10989
11066
  HEARTBEAT_ENGINE_VERSION: HEARTBEAT_ENGINE_VERSION,
10990
11067
  'default': WebSocketClient
10991
11068
  });
@@ -11878,7 +11955,7 @@ class Room$1 extends Emitter {
11878
11955
  }
11879
11956
 
11880
11957
  _mapMsid(rawSdp ) {
11881
- const sdp = sdpParser__default["default"].parse(rawSdp);
11958
+ const sdp = sdpParser__default['default'].parse(rawSdp);
11882
11959
  const labelMsidArray = sdp.media.filter(media => !!media.label).map(({ label, msid }) => ({
11883
11960
  label: String(label),
11884
11961
  streamId: msid.split(' ')[0],
@@ -136,6 +136,7 @@ class IssueReporter {
136
136
 
137
137
 
138
138
 
139
+
139
140
 
140
141
  constructor() {
141
142
  addLevelsTo(this);
@@ -147,12 +148,17 @@ class IssueReporter {
147
148
  this.bufferTimeout = null;
148
149
  this._boundProcessBuffer = this._processBuffer.bind(this);
149
150
  this._boundParseLoggerBody = this._parseLoggerBody.bind(this);
151
+ this._callback = null;
150
152
  }
151
153
 
152
154
  init() {
153
155
  this._catchConsole();
154
156
  }
155
157
 
158
+ setCallback(cb ) {
159
+ this._callback = cb;
160
+ }
161
+
156
162
  configureRemoteClient(configuration = { tag: 'wazo-sdk', host: null, port: null, level: null, extra: {} }) {
157
163
  this.remoteClientConfiguration = configuration;
158
164
  }
@@ -188,6 +194,7 @@ class IssueReporter {
188
194
 
189
195
  // Handle category label
190
196
  let category = null;
197
+ let skipSendToRemote = false;
191
198
  let extra = {};
192
199
  if (args[0].indexOf(CATEGORY_PREFIX) === 0) {
193
200
  category = args[0].split('=')[1];
@@ -203,6 +210,7 @@ class IssueReporter {
203
210
  errorMessage: lastArg.message,
204
211
  errorStack: lastArg.stack,
205
212
  errorType: lastArg.constructor.name,
213
+ skipSendToRemote: lastArg.skipSendToRemote,
206
214
  };
207
215
  } else {
208
216
  extra = lastArg;
@@ -211,7 +219,12 @@ class IssueReporter {
211
219
  args.splice(1, 1);
212
220
  }
213
221
 
214
- const date = moment__default["default"]().format('YYYY-MM-DD HH:mm:ss.SSS');
222
+ if (extra.skipSendToRemote) {
223
+ skipSendToRemote = true;
224
+ delete extra.skipSendToRemote;
225
+ }
226
+
227
+ const date = moment__default['default']().format('YYYY-MM-DD HH:mm:ss.SSS');
215
228
  const message = args.join(', ');
216
229
  let consoleMessage = message;
217
230
 
@@ -231,7 +244,13 @@ class IssueReporter {
231
244
  const oldMethod = this.oldConsoleMethods[consoleLevel] || this.oldConsoleMethods.log;
232
245
  oldMethod.apply(oldMethod, [date, consoleMessage]);
233
246
 
234
- this._sendToRemoteLogger(level, { date, message, category, ...extra });
247
+ if (this._callback) {
248
+ this._callback(level, consoleMessage);
249
+ }
250
+
251
+ if (!skipSendToRemote) {
252
+ this._sendToRemoteLogger(level, { date, message, category, ...extra });
253
+ }
235
254
  }
236
255
 
237
256
  logRequest(url , options , response , start ) {
@@ -376,7 +395,11 @@ class IssueReporter {
376
395
  },
377
396
  // $FlowFixMe
378
397
  body,
379
- }).catch(() => {
398
+ }).catch((e ) => {
399
+ // $FlowFixMe
400
+ e.skipSendToRemote = true;
401
+ this.log('error', this._makeCategory('grafana'), 'Sending log to grafana, error', e);
402
+
380
403
  setTimeout(() => {
381
404
  if (isArray) {
382
405
  payload = payload.map(message => {
@@ -388,7 +411,7 @@ class IssueReporter {
388
411
  payload._retry = retry + 1;
389
412
  }
390
413
 
391
- this._sendDebugToGrafana(body, retry + 1);
414
+ this._sendDebugToGrafana(payload, retry + 1);
392
415
  }, 5000 + retry * 1000);
393
416
  });
394
417
  }
@@ -2591,7 +2614,8 @@ class ExternalApp {
2591
2614
 
2592
2615
 
2593
2616
 
2594
-
2617
+
2618
+
2595
2619
 
2596
2620
 
2597
2621
  class Meeting {
@@ -2603,6 +2627,7 @@ class Meeting {
2603
2627
 
2604
2628
 
2605
2629
 
2630
+
2606
2631
 
2607
2632
 
2608
2633
  static parse(plain ) {
@@ -2614,14 +2639,28 @@ class Meeting {
2614
2639
  port: plain.port,
2615
2640
  uuid: plain.uuid,
2616
2641
  number: plain.number,
2642
+ persistent: plain.persistent,
2617
2643
  });
2618
2644
  }
2619
2645
 
2646
+ static parseMany(items ) {
2647
+ return items.map(plain => Meeting.parse(plain));
2648
+ }
2649
+
2620
2650
  static newFrom(meeting ) {
2621
2651
  return newFrom(meeting, Meeting);
2622
2652
  }
2623
2653
 
2624
- constructor({ uuid, name, guestSipAuthorization, ownerUuids, port, uri, number } = {}) {
2654
+ constructor({
2655
+ uuid,
2656
+ name,
2657
+ guestSipAuthorization,
2658
+ ownerUuids,
2659
+ port,
2660
+ uri,
2661
+ number,
2662
+ persistent,
2663
+ } = {}) {
2625
2664
  this.guestSipAuthorization = guestSipAuthorization;
2626
2665
  this.uri = uri;
2627
2666
  this.name = name;
@@ -2629,6 +2668,7 @@ class Meeting {
2629
2668
  this.port = port;
2630
2669
  this.uuid = uuid;
2631
2670
  this.number = number;
2671
+ this.persistent = persistent;
2632
2672
 
2633
2673
  // Useful to compare instead of instanceof with minified code
2634
2674
  this.type = 'Meeting';
@@ -2706,8 +2746,11 @@ var confdMethods = (client , baseUrl ) => ({
2706
2746
  }
2707
2747
  },
2708
2748
 
2709
- createMyMeeting: (name ) =>
2710
- client.post(`${baseUrl}/users/me/meetings`, { name }).then(Meeting.parse),
2749
+ getMyMeetings: () =>
2750
+ client.get(`${baseUrl}/users/me/meetings`).then(response => Meeting.parseMany(response.items)),
2751
+
2752
+ createMyMeeting: (name , persistent ) =>
2753
+ client.post(`${baseUrl}/users/me/meetings`, { name, persistent }).then(Meeting.parse),
2711
2754
 
2712
2755
  deleteMyMeeting: (meetingUuid ) =>
2713
2756
  client.delete(`${baseUrl}/users/me/meetings/${meetingUuid}`, null),
@@ -2809,7 +2852,7 @@ class ChatMessage {
2809
2852
  static parse(plain ) {
2810
2853
  return new ChatMessage({
2811
2854
  uuid: plain.uuid,
2812
- date: moment__default["default"](plain.created_at).toDate(),
2855
+ date: moment__default['default'](plain.created_at).toDate(),
2813
2856
  content: plain.content,
2814
2857
  alias: plain.alias,
2815
2858
  userUuid: plain.user_uuid,
@@ -2901,7 +2944,7 @@ class Voicemail {
2901
2944
  static parse(plain ) {
2902
2945
  return new Voicemail({
2903
2946
  id: plain.id,
2904
- date: moment__default["default"](plain.timestamp * 1000).toDate(),
2947
+ date: moment__default['default'](plain.timestamp * 1000).toDate(),
2905
2948
  duration: plain.duration * 1000,
2906
2949
  caller: {
2907
2950
  name: plain.caller_id_name,
@@ -3038,7 +3081,7 @@ class Call {
3038
3081
  onHold: plain.on_hold,
3039
3082
  status: plain.status,
3040
3083
  lineId: plain.line_id,
3041
- startingTime: moment__default["default"](plain.creation_time).toDate(),
3084
+ startingTime: moment__default['default'](plain.creation_time).toDate(),
3042
3085
  talkingToIds: Object.keys(plain.talking_to || {}),
3043
3086
  recording: plain.record_state === RECORD_STATE_ACTIVE,
3044
3087
  });
@@ -3192,7 +3235,7 @@ class Recording {
3192
3235
 
3193
3236
 
3194
3237
 
3195
- static parseMany(recordings ) {
3238
+ static parseMany(recordings = []) {
3196
3239
  return recordings.map(item => Recording.parse(item));
3197
3240
  }
3198
3241
 
@@ -3200,8 +3243,8 @@ class Recording {
3200
3243
  return new Recording({
3201
3244
  deleted: plain.deleted,
3202
3245
  fileName: plain.filename,
3203
- end: plain.end_time ? moment__default["default"](plain.end_time).toDate() : null,
3204
- start: moment__default["default"](plain.start_time).toDate(),
3246
+ end: plain.end_time ? moment__default['default'](plain.end_time).toDate() : null,
3247
+ start: moment__default['default'](plain.start_time).toDate(),
3205
3248
  uuid: plain.uuid,
3206
3249
  });
3207
3250
  }
@@ -3299,7 +3342,7 @@ class CallLog {
3299
3342
 
3300
3343
  static parse(plain ) {
3301
3344
  return new CallLog({
3302
- answer: plain.answer ? moment__default["default"](plain.answer).toDate() : null,
3345
+ answer: plain.answer ? moment__default['default'](plain.answer).toDate() : null,
3303
3346
  answered: plain.answered,
3304
3347
  callDirection: plain.call_direction,
3305
3348
  destination: {
@@ -3316,9 +3359,9 @@ class CallLog {
3316
3359
  },
3317
3360
  id: plain.id,
3318
3361
  duration: (plain.duration || 0) * 1000, // duration is in seconds
3319
- start: moment__default["default"](plain.start).toDate(),
3320
- end: plain.end ? moment__default["default"](plain.end).toDate() : null,
3321
- recordings: Recording.parseMany(plain.recordings),
3362
+ start: moment__default['default'](plain.start).toDate(),
3363
+ end: plain.end ? moment__default['default'](plain.end).toDate() : null,
3364
+ recordings: Recording.parseMany(plain.recordings || []),
3322
3365
  });
3323
3366
  }
3324
3367