@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
@@ -1634,6 +1634,7 @@ class IssueReporter {
1634
1634
 
1635
1635
 
1636
1636
 
1637
+
1637
1638
 
1638
1639
  constructor() {
1639
1640
  addLevelsTo(this);
@@ -1645,12 +1646,17 @@ class IssueReporter {
1645
1646
  this.bufferTimeout = null;
1646
1647
  this._boundProcessBuffer = this._processBuffer.bind(this);
1647
1648
  this._boundParseLoggerBody = this._parseLoggerBody.bind(this);
1649
+ this._callback = null;
1648
1650
  }
1649
1651
 
1650
1652
  init() {
1651
1653
  this._catchConsole();
1652
1654
  }
1653
1655
 
1656
+ setCallback(cb ) {
1657
+ this._callback = cb;
1658
+ }
1659
+
1654
1660
  configureRemoteClient(configuration = { tag: 'wazo-sdk', host: null, port: null, level: null, extra: {} }) {
1655
1661
  this.remoteClientConfiguration = configuration;
1656
1662
  }
@@ -1686,6 +1692,7 @@ class IssueReporter {
1686
1692
 
1687
1693
  // Handle category label
1688
1694
  let category = null;
1695
+ let skipSendToRemote = false;
1689
1696
  let extra = {};
1690
1697
  if (args[0].indexOf(CATEGORY_PREFIX) === 0) {
1691
1698
  category = args[0].split('=')[1];
@@ -1701,6 +1708,7 @@ class IssueReporter {
1701
1708
  errorMessage: lastArg.message,
1702
1709
  errorStack: lastArg.stack,
1703
1710
  errorType: lastArg.constructor.name,
1711
+ skipSendToRemote: lastArg.skipSendToRemote,
1704
1712
  };
1705
1713
  } else {
1706
1714
  extra = lastArg;
@@ -1709,6 +1717,11 @@ class IssueReporter {
1709
1717
  args.splice(1, 1);
1710
1718
  }
1711
1719
 
1720
+ if (extra.skipSendToRemote) {
1721
+ skipSendToRemote = true;
1722
+ delete extra.skipSendToRemote;
1723
+ }
1724
+
1712
1725
  const date = moment().format('YYYY-MM-DD HH:mm:ss.SSS');
1713
1726
  const message = args.join(', ');
1714
1727
  let consoleMessage = message;
@@ -1729,7 +1742,13 @@ class IssueReporter {
1729
1742
  const oldMethod = this.oldConsoleMethods[consoleLevel] || this.oldConsoleMethods.log;
1730
1743
  oldMethod.apply(oldMethod, [date, consoleMessage]);
1731
1744
 
1732
- this._sendToRemoteLogger(level, { date, message, category, ...extra });
1745
+ if (this._callback) {
1746
+ this._callback(level, consoleMessage);
1747
+ }
1748
+
1749
+ if (!skipSendToRemote) {
1750
+ this._sendToRemoteLogger(level, { date, message, category, ...extra });
1751
+ }
1733
1752
  }
1734
1753
 
1735
1754
  logRequest(url , options , response , start ) {
@@ -1874,7 +1893,11 @@ class IssueReporter {
1874
1893
  },
1875
1894
  // $FlowFixMe
1876
1895
  body,
1877
- }).catch(() => {
1896
+ }).catch((e ) => {
1897
+ // $FlowFixMe
1898
+ e.skipSendToRemote = true;
1899
+ this.log('error', this._makeCategory('grafana'), 'Sending log to grafana, error', e);
1900
+
1878
1901
  setTimeout(() => {
1879
1902
  if (isArray) {
1880
1903
  payload = payload.map(message => {
@@ -1886,7 +1909,7 @@ class IssueReporter {
1886
1909
  payload._retry = retry + 1;
1887
1910
  }
1888
1911
 
1889
- this._sendDebugToGrafana(body, retry + 1);
1912
+ this._sendDebugToGrafana(payload, retry + 1);
1890
1913
  }, 5000 + retry * 1000);
1891
1914
  });
1892
1915
  }
@@ -2604,7 +2627,8 @@ class ExternalApp {
2604
2627
 
2605
2628
 
2606
2629
 
2607
-
2630
+
2631
+
2608
2632
 
2609
2633
 
2610
2634
  class Meeting {
@@ -2616,6 +2640,7 @@ class Meeting {
2616
2640
 
2617
2641
 
2618
2642
 
2643
+
2619
2644
 
2620
2645
 
2621
2646
  static parse(plain ) {
@@ -2627,14 +2652,28 @@ class Meeting {
2627
2652
  port: plain.port,
2628
2653
  uuid: plain.uuid,
2629
2654
  number: plain.number,
2655
+ persistent: plain.persistent,
2630
2656
  });
2631
2657
  }
2632
2658
 
2659
+ static parseMany(items ) {
2660
+ return items.map(plain => Meeting.parse(plain));
2661
+ }
2662
+
2633
2663
  static newFrom(meeting ) {
2634
2664
  return newFrom(meeting, Meeting);
2635
2665
  }
2636
2666
 
2637
- constructor({ uuid, name, guestSipAuthorization, ownerUuids, port, uri, number } = {}) {
2667
+ constructor({
2668
+ uuid,
2669
+ name,
2670
+ guestSipAuthorization,
2671
+ ownerUuids,
2672
+ port,
2673
+ uri,
2674
+ number,
2675
+ persistent,
2676
+ } = {}) {
2638
2677
  this.guestSipAuthorization = guestSipAuthorization;
2639
2678
  this.uri = uri;
2640
2679
  this.name = name;
@@ -2642,6 +2681,7 @@ class Meeting {
2642
2681
  this.port = port;
2643
2682
  this.uuid = uuid;
2644
2683
  this.number = number;
2684
+ this.persistent = persistent;
2645
2685
 
2646
2686
  // Useful to compare instead of instanceof with minified code
2647
2687
  this.type = 'Meeting';
@@ -2719,8 +2759,11 @@ var confdMethods = (client , baseUrl ) => ({
2719
2759
  }
2720
2760
  },
2721
2761
 
2722
- createMyMeeting: (name ) =>
2723
- client.post(`${baseUrl}/users/me/meetings`, { name }).then(Meeting.parse),
2762
+ getMyMeetings: () =>
2763
+ client.get(`${baseUrl}/users/me/meetings`).then(response => Meeting.parseMany(response.items)),
2764
+
2765
+ createMyMeeting: (name , persistent ) =>
2766
+ client.post(`${baseUrl}/users/me/meetings`, { name, persistent }).then(Meeting.parse),
2724
2767
 
2725
2768
  deleteMyMeeting: (meetingUuid ) =>
2726
2769
  client.delete(`${baseUrl}/users/me/meetings/${meetingUuid}`, null),
@@ -3576,7 +3619,7 @@ class Recording {
3576
3619
 
3577
3620
 
3578
3621
 
3579
- static parseMany(recordings ) {
3622
+ static parseMany(recordings = []) {
3580
3623
  return recordings.map(item => Recording.parse(item));
3581
3624
  }
3582
3625
 
@@ -3702,7 +3745,7 @@ class CallLog {
3702
3745
  duration: (plain.duration || 0) * 1000, // duration is in seconds
3703
3746
  start: moment(plain.start).toDate(),
3704
3747
  end: plain.end ? moment(plain.end).toDate() : null,
3705
- recordings: Recording.parseMany(plain.recordings),
3748
+ recordings: Recording.parseMany(plain.recordings || []),
3706
3749
  });
3707
3750
  }
3708
3751
 
@@ -6956,7 +6999,9 @@ class WebRTCClient extends Emitter {
6956
6999
  const inviteOptions = {
6957
7000
  requestDelegate: {
6958
7001
  onAccept: (response ) => {
6959
- session.sessionDescriptionHandler.peerConnection.sfu = conference;
7002
+ if (session.sessionDescriptionHandler.peerConnection) {
7003
+ session.sessionDescriptionHandler.peerConnection.sfu = conference;
7004
+ }
6960
7005
  this._onAccepted(session, response.session, true);
6961
7006
  },
6962
7007
  onReject: (response ) => {
@@ -7292,7 +7337,7 @@ class WebRTCClient extends Emitter {
7292
7337
  // We search for the last transceiver without `video-` in the mid (video- means remote transceiver)
7293
7338
  const transceivers = pc.getTransceivers();
7294
7339
  const transceiverIdx = lastIndexOf(transceivers, transceiver =>
7295
- transceiver.sender.track === null && transceiver.mid.indexOf('video') === -1);
7340
+ transceiver.sender.track === null && transceiver.mid && transceiver.mid.indexOf('video') === -1);
7296
7341
 
7297
7342
  videoSender = transceiverIdx !== -1 ? transceivers[transceiverIdx].sender : null;
7298
7343
  } else {
@@ -7828,6 +7873,16 @@ class WebRTCClient extends Emitter {
7828
7873
  return this.hasRemoteVideo(sessionId) ? this.getRemoteStream(sessionId) : null;
7829
7874
  }
7830
7875
 
7876
+ // Useful in a react-native environment when remoteMediaStream is not updated
7877
+ getRemoteVideoStreamFromPc(sessionId ) {
7878
+ const pc = this.getPeerConnection(sessionId);
7879
+ if (!pc) {
7880
+ return null;
7881
+ }
7882
+
7883
+ return pc.getRemoteStreams().find(stream => !!stream.getVideoTracks().length);
7884
+ }
7885
+
7831
7886
  hasVideo(sessionId ) {
7832
7887
  return this.hasLocalVideo(sessionId) || this.hasRemoteVideo(sessionId);
7833
7888
  }
@@ -8338,6 +8393,7 @@ class WebRTCClient extends Emitter {
8338
8393
  session.sessionDescriptionHandler.remoteMediaStream.onaddtrack = onTrack;
8339
8394
 
8340
8395
  pc.oniceconnectionstatechange = () => {
8396
+ logger$8.info('on ice connection state changed', { state: pc.iceConnectionState });
8341
8397
  if (pc.iceConnectionState === 'disconnected') {
8342
8398
  this.eventEmitter.emit(ON_DISCONNECTED$1);
8343
8399
  }
@@ -8606,18 +8662,22 @@ class WebRTCClient extends Emitter {
8606
8662
  });
8607
8663
 
8608
8664
  networkStats.packetsLost = packetsLost;
8609
- networkStats.audioBytesSent = audioBytesSent;
8665
+ networkStats.totalAudioBytesSent = audioBytesSent;
8666
+ networkStats.audioBytesSent = audioBytesSent - lastAudioSent;
8667
+ networkStats.totalAudioBytesReceived = audioBytesReceived - lastAudioReceived;
8610
8668
  networkStats.audioBytesReceived = audioBytesReceived;
8611
- networkStats.videoBytesSent = videoBytesSent;
8612
- networkStats.videoBytesReceived = videoBytesReceived;
8669
+ networkStats.totalVideoBytesSent = videoBytesSent;
8670
+ networkStats.videoBytesSent = videoBytesSent - lastVideoSent;
8671
+ networkStats.totalVideoBytesReceived = videoBytesReceived;
8672
+ networkStats.videoBytesReceived = videoBytesReceived - lastVideoReceived;
8673
+ networkStats.totalTransportSent = transportSent - lastTransportSent;
8613
8674
  networkStats.transportSent = transportSent;
8614
- networkStats.transportReceived = transportReceived;
8615
-
8616
- const bandwidth = (networkStats.audioBytesSent - lastAudioSent) + (networkStats.videoBytesSent - lastVideoSent)
8617
- + (networkStats.audioBytesReceived - lastAudioReceived) + (networkStats.videoBytesReceived - lastVideoReceived)
8618
- + (networkStats.transportReceived - lastTransportReceived) + (networkStats.transportSent - lastTransportSent);
8675
+ networkStats.totalTransportReceived = transportReceived;
8676
+ networkStats.transportReceived = transportReceived - lastTransportReceived;
8619
8677
 
8620
- networkStats.bandwidth = bandwidth;
8678
+ networkStats.bandwidth = networkStats.audioBytesSent + networkStats.audioBytesReceived
8679
+ + networkStats.videoBytesSent + networkStats.videoBytesReceived + networkStats.transportReceived
8680
+ + networkStats.transportSent;
8621
8681
 
8622
8682
  this.eventEmitter.emit(ON_NETWORK_STATS$1, session, networkStats, this.sessionNetworkStats[sessionId]);
8623
8683
  this.sessionNetworkStats[sessionId].push(networkStats);
@@ -8999,7 +9059,10 @@ class WebRTCPhone extends Emitter {
8999
9059
 
9000
9060
  onCancel(message);
9001
9061
  const elsewhere = message.data.indexOf('cause=26') !== -1 && message.data.indexOf('completed elsewhere') !== -1;
9002
- this.eventEmitter.emit(ON_CALL_CANCELED, this._createCallSession(sipSession), elsewhere);
9062
+ const callSession = this._createCallSession(sipSession);
9063
+ delete this.callSessions[callSession.getId()];
9064
+
9065
+ this.eventEmitter.emit(ON_CALL_CANCELED, callSession, elsewhere);
9003
9066
  };
9004
9067
  } else if (sipSession instanceof Invitation) {
9005
9068
  console.warn('sipSession._onCancel not found, please update the wazo SDK accordingly');
@@ -9028,9 +9091,11 @@ class WebRTCPhone extends Emitter {
9028
9091
  case SessionState.Terminated: {
9029
9092
  logger$7.info('WebRTC phone - call terminated', { sipId: sipSession.id });
9030
9093
 
9094
+ // Should be called before `_onCallTerminated` or the callCount will not decrement...
9095
+ const callSession = this._createCallSession(sipSession);
9031
9096
  const wasCurrentSession = this._onCallTerminated(sipSession);
9032
9097
 
9033
- return this.eventEmitter.emit(ON_CALL_ENDED, this._createCallSession(sipSession), wasCurrentSession);
9098
+ return this.eventEmitter.emit(ON_CALL_ENDED, callSession, wasCurrentSession);
9034
9099
  }
9035
9100
  }
9036
9101
  });
@@ -9978,6 +10043,10 @@ class WebRTCPhone extends Emitter {
9978
10043
  return callSession ? this.client.getRemoteVideoStream(callSession.sipCallId) : null;
9979
10044
  }
9980
10045
 
10046
+ getRemoteVideoStreamFromPc(callSession ) {
10047
+ return callSession ? this.client.getRemoteVideoStreamFromPc(callSession.sipCallId) : null;
10048
+ }
10049
+
9981
10050
  hasRemoteVideo(callSession ) {
9982
10051
  return callSession ? this.client.hasRemoteVideo(callSession.sipCallId) : false;
9983
10052
  }
@@ -10661,6 +10730,11 @@ class Phone extends Emitter {
10661
10730
  return this.getRemoteVideoStream(callSession);
10662
10731
  }
10663
10732
 
10733
+ // Useful in a react-native environment when remoteMediaStream is not updated
10734
+ getRemoteVideoStreamFromPc(callSession ) {
10735
+ return this.phone ? this.phone.getRemoteVideoStreamFromPc(callSession) : false;
10736
+ }
10737
+
10664
10738
  hasVideo(callSession ) {
10665
10739
  return this.phone ? this.phone.hasVideo(callSession) : false;
10666
10740
  }
@@ -10820,6 +10894,7 @@ const AGENT_PAUSED = 'agent_paused';
10820
10894
  const AGENT_UNPAUSED = 'agent_unpaused';
10821
10895
  const CONFERENCE_ADHOC_PARTICIPANT_LEFT = 'conference_adhoc_participant_left';
10822
10896
  const CONFERENCE_ADHOC_DELETED = 'conference_adhoc_deleted';
10897
+ const MEETING_USER_PROGRESS = 'meeting_user_progress';
10823
10898
 
10824
10899
  const BLACKLIST_EVENTS = [
10825
10900
  CHAT_MESSAGE_SENT,
@@ -11170,6 +11245,7 @@ WebSocketClient.eventLists = [
11170
11245
  AGENT_UNPAUSED,
11171
11246
  CONFERENCE_ADHOC_PARTICIPANT_LEFT,
11172
11247
  CONFERENCE_ADHOC_DELETED,
11248
+ MEETING_USER_PROGRESS,
11173
11249
  ];
11174
11250
 
11175
11251
  var WebSocketClient$1 = /*#__PURE__*/Object.freeze({
@@ -11240,6 +11316,7 @@ var WebSocketClient$1 = /*#__PURE__*/Object.freeze({
11240
11316
  AGENT_UNPAUSED: AGENT_UNPAUSED,
11241
11317
  CONFERENCE_ADHOC_PARTICIPANT_LEFT: CONFERENCE_ADHOC_PARTICIPANT_LEFT,
11242
11318
  CONFERENCE_ADHOC_DELETED: CONFERENCE_ADHOC_DELETED,
11319
+ MEETING_USER_PROGRESS: MEETING_USER_PROGRESS,
11243
11320
  HEARTBEAT_ENGINE_VERSION: HEARTBEAT_ENGINE_VERSION,
11244
11321
  'default': WebSocketClient
11245
11322
  });
@@ -1634,6 +1634,7 @@ class IssueReporter {
1634
1634
 
1635
1635
 
1636
1636
 
1637
+
1637
1638
 
1638
1639
  constructor() {
1639
1640
  addLevelsTo(this);
@@ -1645,12 +1646,17 @@ class IssueReporter {
1645
1646
  this.bufferTimeout = null;
1646
1647
  this._boundProcessBuffer = this._processBuffer.bind(this);
1647
1648
  this._boundParseLoggerBody = this._parseLoggerBody.bind(this);
1649
+ this._callback = null;
1648
1650
  }
1649
1651
 
1650
1652
  init() {
1651
1653
  this._catchConsole();
1652
1654
  }
1653
1655
 
1656
+ setCallback(cb ) {
1657
+ this._callback = cb;
1658
+ }
1659
+
1654
1660
  configureRemoteClient(configuration = { tag: 'wazo-sdk', host: null, port: null, level: null, extra: {} }) {
1655
1661
  this.remoteClientConfiguration = configuration;
1656
1662
  }
@@ -1686,6 +1692,7 @@ class IssueReporter {
1686
1692
 
1687
1693
  // Handle category label
1688
1694
  let category = null;
1695
+ let skipSendToRemote = false;
1689
1696
  let extra = {};
1690
1697
  if (args[0].indexOf(CATEGORY_PREFIX) === 0) {
1691
1698
  category = args[0].split('=')[1];
@@ -1701,6 +1708,7 @@ class IssueReporter {
1701
1708
  errorMessage: lastArg.message,
1702
1709
  errorStack: lastArg.stack,
1703
1710
  errorType: lastArg.constructor.name,
1711
+ skipSendToRemote: lastArg.skipSendToRemote,
1704
1712
  };
1705
1713
  } else {
1706
1714
  extra = lastArg;
@@ -1709,6 +1717,11 @@ class IssueReporter {
1709
1717
  args.splice(1, 1);
1710
1718
  }
1711
1719
 
1720
+ if (extra.skipSendToRemote) {
1721
+ skipSendToRemote = true;
1722
+ delete extra.skipSendToRemote;
1723
+ }
1724
+
1712
1725
  const date = moment().format('YYYY-MM-DD HH:mm:ss.SSS');
1713
1726
  const message = args.join(', ');
1714
1727
  let consoleMessage = message;
@@ -1729,7 +1742,13 @@ class IssueReporter {
1729
1742
  const oldMethod = this.oldConsoleMethods[consoleLevel] || this.oldConsoleMethods.log;
1730
1743
  oldMethod.apply(oldMethod, [date, consoleMessage]);
1731
1744
 
1732
- this._sendToRemoteLogger(level, { date, message, category, ...extra });
1745
+ if (this._callback) {
1746
+ this._callback(level, consoleMessage);
1747
+ }
1748
+
1749
+ if (!skipSendToRemote) {
1750
+ this._sendToRemoteLogger(level, { date, message, category, ...extra });
1751
+ }
1733
1752
  }
1734
1753
 
1735
1754
  logRequest(url , options , response , start ) {
@@ -1874,7 +1893,11 @@ class IssueReporter {
1874
1893
  },
1875
1894
  // $FlowFixMe
1876
1895
  body,
1877
- }).catch(() => {
1896
+ }).catch((e ) => {
1897
+ // $FlowFixMe
1898
+ e.skipSendToRemote = true;
1899
+ this.log('error', this._makeCategory('grafana'), 'Sending log to grafana, error', e);
1900
+
1878
1901
  setTimeout(() => {
1879
1902
  if (isArray) {
1880
1903
  payload = payload.map(message => {
@@ -1886,7 +1909,7 @@ class IssueReporter {
1886
1909
  payload._retry = retry + 1;
1887
1910
  }
1888
1911
 
1889
- this._sendDebugToGrafana(body, retry + 1);
1912
+ this._sendDebugToGrafana(payload, retry + 1);
1890
1913
  }, 5000 + retry * 1000);
1891
1914
  });
1892
1915
  }
@@ -2604,7 +2627,8 @@ class ExternalApp {
2604
2627
 
2605
2628
 
2606
2629
 
2607
-
2630
+
2631
+
2608
2632
 
2609
2633
 
2610
2634
  class Meeting {
@@ -2616,6 +2640,7 @@ class Meeting {
2616
2640
 
2617
2641
 
2618
2642
 
2643
+
2619
2644
 
2620
2645
 
2621
2646
  static parse(plain ) {
@@ -2627,14 +2652,28 @@ class Meeting {
2627
2652
  port: plain.port,
2628
2653
  uuid: plain.uuid,
2629
2654
  number: plain.number,
2655
+ persistent: plain.persistent,
2630
2656
  });
2631
2657
  }
2632
2658
 
2659
+ static parseMany(items ) {
2660
+ return items.map(plain => Meeting.parse(plain));
2661
+ }
2662
+
2633
2663
  static newFrom(meeting ) {
2634
2664
  return newFrom(meeting, Meeting);
2635
2665
  }
2636
2666
 
2637
- constructor({ uuid, name, guestSipAuthorization, ownerUuids, port, uri, number } = {}) {
2667
+ constructor({
2668
+ uuid,
2669
+ name,
2670
+ guestSipAuthorization,
2671
+ ownerUuids,
2672
+ port,
2673
+ uri,
2674
+ number,
2675
+ persistent,
2676
+ } = {}) {
2638
2677
  this.guestSipAuthorization = guestSipAuthorization;
2639
2678
  this.uri = uri;
2640
2679
  this.name = name;
@@ -2642,6 +2681,7 @@ class Meeting {
2642
2681
  this.port = port;
2643
2682
  this.uuid = uuid;
2644
2683
  this.number = number;
2684
+ this.persistent = persistent;
2645
2685
 
2646
2686
  // Useful to compare instead of instanceof with minified code
2647
2687
  this.type = 'Meeting';
@@ -2719,8 +2759,11 @@ var confdMethods = (client , baseUrl ) => ({
2719
2759
  }
2720
2760
  },
2721
2761
 
2722
- createMyMeeting: (name ) =>
2723
- client.post(`${baseUrl}/users/me/meetings`, { name }).then(Meeting.parse),
2762
+ getMyMeetings: () =>
2763
+ client.get(`${baseUrl}/users/me/meetings`).then(response => Meeting.parseMany(response.items)),
2764
+
2765
+ createMyMeeting: (name , persistent ) =>
2766
+ client.post(`${baseUrl}/users/me/meetings`, { name, persistent }).then(Meeting.parse),
2724
2767
 
2725
2768
  deleteMyMeeting: (meetingUuid ) =>
2726
2769
  client.delete(`${baseUrl}/users/me/meetings/${meetingUuid}`, null),
@@ -3576,7 +3619,7 @@ class Recording {
3576
3619
 
3577
3620
 
3578
3621
 
3579
- static parseMany(recordings ) {
3622
+ static parseMany(recordings = []) {
3580
3623
  return recordings.map(item => Recording.parse(item));
3581
3624
  }
3582
3625
 
@@ -3702,7 +3745,7 @@ class CallLog {
3702
3745
  duration: (plain.duration || 0) * 1000, // duration is in seconds
3703
3746
  start: moment(plain.start).toDate(),
3704
3747
  end: plain.end ? moment(plain.end).toDate() : null,
3705
- recordings: Recording.parseMany(plain.recordings),
3748
+ recordings: Recording.parseMany(plain.recordings || []),
3706
3749
  });
3707
3750
  }
3708
3751
 
@@ -6956,7 +6999,9 @@ class WebRTCClient extends Emitter {
6956
6999
  const inviteOptions = {
6957
7000
  requestDelegate: {
6958
7001
  onAccept: (response ) => {
6959
- session.sessionDescriptionHandler.peerConnection.sfu = conference;
7002
+ if (session.sessionDescriptionHandler.peerConnection) {
7003
+ session.sessionDescriptionHandler.peerConnection.sfu = conference;
7004
+ }
6960
7005
  this._onAccepted(session, response.session, true);
6961
7006
  },
6962
7007
  onReject: (response ) => {
@@ -7292,7 +7337,7 @@ class WebRTCClient extends Emitter {
7292
7337
  // We search for the last transceiver without `video-` in the mid (video- means remote transceiver)
7293
7338
  const transceivers = pc.getTransceivers();
7294
7339
  const transceiverIdx = lastIndexOf(transceivers, transceiver =>
7295
- transceiver.sender.track === null && transceiver.mid.indexOf('video') === -1);
7340
+ transceiver.sender.track === null && transceiver.mid && transceiver.mid.indexOf('video') === -1);
7296
7341
 
7297
7342
  videoSender = transceiverIdx !== -1 ? transceivers[transceiverIdx].sender : null;
7298
7343
  } else {
@@ -7828,6 +7873,16 @@ class WebRTCClient extends Emitter {
7828
7873
  return this.hasRemoteVideo(sessionId) ? this.getRemoteStream(sessionId) : null;
7829
7874
  }
7830
7875
 
7876
+ // Useful in a react-native environment when remoteMediaStream is not updated
7877
+ getRemoteVideoStreamFromPc(sessionId ) {
7878
+ const pc = this.getPeerConnection(sessionId);
7879
+ if (!pc) {
7880
+ return null;
7881
+ }
7882
+
7883
+ return pc.getRemoteStreams().find(stream => !!stream.getVideoTracks().length);
7884
+ }
7885
+
7831
7886
  hasVideo(sessionId ) {
7832
7887
  return this.hasLocalVideo(sessionId) || this.hasRemoteVideo(sessionId);
7833
7888
  }
@@ -8338,6 +8393,7 @@ class WebRTCClient extends Emitter {
8338
8393
  session.sessionDescriptionHandler.remoteMediaStream.onaddtrack = onTrack;
8339
8394
 
8340
8395
  pc.oniceconnectionstatechange = () => {
8396
+ logger$8.info('on ice connection state changed', { state: pc.iceConnectionState });
8341
8397
  if (pc.iceConnectionState === 'disconnected') {
8342
8398
  this.eventEmitter.emit(ON_DISCONNECTED$1);
8343
8399
  }
@@ -8606,18 +8662,22 @@ class WebRTCClient extends Emitter {
8606
8662
  });
8607
8663
 
8608
8664
  networkStats.packetsLost = packetsLost;
8609
- networkStats.audioBytesSent = audioBytesSent;
8665
+ networkStats.totalAudioBytesSent = audioBytesSent;
8666
+ networkStats.audioBytesSent = audioBytesSent - lastAudioSent;
8667
+ networkStats.totalAudioBytesReceived = audioBytesReceived - lastAudioReceived;
8610
8668
  networkStats.audioBytesReceived = audioBytesReceived;
8611
- networkStats.videoBytesSent = videoBytesSent;
8612
- networkStats.videoBytesReceived = videoBytesReceived;
8669
+ networkStats.totalVideoBytesSent = videoBytesSent;
8670
+ networkStats.videoBytesSent = videoBytesSent - lastVideoSent;
8671
+ networkStats.totalVideoBytesReceived = videoBytesReceived;
8672
+ networkStats.videoBytesReceived = videoBytesReceived - lastVideoReceived;
8673
+ networkStats.totalTransportSent = transportSent - lastTransportSent;
8613
8674
  networkStats.transportSent = transportSent;
8614
- networkStats.transportReceived = transportReceived;
8615
-
8616
- const bandwidth = (networkStats.audioBytesSent - lastAudioSent) + (networkStats.videoBytesSent - lastVideoSent)
8617
- + (networkStats.audioBytesReceived - lastAudioReceived) + (networkStats.videoBytesReceived - lastVideoReceived)
8618
- + (networkStats.transportReceived - lastTransportReceived) + (networkStats.transportSent - lastTransportSent);
8675
+ networkStats.totalTransportReceived = transportReceived;
8676
+ networkStats.transportReceived = transportReceived - lastTransportReceived;
8619
8677
 
8620
- networkStats.bandwidth = bandwidth;
8678
+ networkStats.bandwidth = networkStats.audioBytesSent + networkStats.audioBytesReceived
8679
+ + networkStats.videoBytesSent + networkStats.videoBytesReceived + networkStats.transportReceived
8680
+ + networkStats.transportSent;
8621
8681
 
8622
8682
  this.eventEmitter.emit(ON_NETWORK_STATS$1, session, networkStats, this.sessionNetworkStats[sessionId]);
8623
8683
  this.sessionNetworkStats[sessionId].push(networkStats);
@@ -8999,7 +9059,10 @@ class WebRTCPhone extends Emitter {
8999
9059
 
9000
9060
  onCancel(message);
9001
9061
  const elsewhere = message.data.indexOf('cause=26') !== -1 && message.data.indexOf('completed elsewhere') !== -1;
9002
- this.eventEmitter.emit(ON_CALL_CANCELED, this._createCallSession(sipSession), elsewhere);
9062
+ const callSession = this._createCallSession(sipSession);
9063
+ delete this.callSessions[callSession.getId()];
9064
+
9065
+ this.eventEmitter.emit(ON_CALL_CANCELED, callSession, elsewhere);
9003
9066
  };
9004
9067
  } else if (sipSession instanceof Invitation) {
9005
9068
  console.warn('sipSession._onCancel not found, please update the wazo SDK accordingly');
@@ -9028,9 +9091,11 @@ class WebRTCPhone extends Emitter {
9028
9091
  case SessionState.Terminated: {
9029
9092
  logger$7.info('WebRTC phone - call terminated', { sipId: sipSession.id });
9030
9093
 
9094
+ // Should be called before `_onCallTerminated` or the callCount will not decrement...
9095
+ const callSession = this._createCallSession(sipSession);
9031
9096
  const wasCurrentSession = this._onCallTerminated(sipSession);
9032
9097
 
9033
- return this.eventEmitter.emit(ON_CALL_ENDED, this._createCallSession(sipSession), wasCurrentSession);
9098
+ return this.eventEmitter.emit(ON_CALL_ENDED, callSession, wasCurrentSession);
9034
9099
  }
9035
9100
  }
9036
9101
  });
@@ -9978,6 +10043,10 @@ class WebRTCPhone extends Emitter {
9978
10043
  return callSession ? this.client.getRemoteVideoStream(callSession.sipCallId) : null;
9979
10044
  }
9980
10045
 
10046
+ getRemoteVideoStreamFromPc(callSession ) {
10047
+ return callSession ? this.client.getRemoteVideoStreamFromPc(callSession.sipCallId) : null;
10048
+ }
10049
+
9981
10050
  hasRemoteVideo(callSession ) {
9982
10051
  return callSession ? this.client.hasRemoteVideo(callSession.sipCallId) : false;
9983
10052
  }
@@ -10661,6 +10730,11 @@ class Phone extends Emitter {
10661
10730
  return this.getRemoteVideoStream(callSession);
10662
10731
  }
10663
10732
 
10733
+ // Useful in a react-native environment when remoteMediaStream is not updated
10734
+ getRemoteVideoStreamFromPc(callSession ) {
10735
+ return this.phone ? this.phone.getRemoteVideoStreamFromPc(callSession) : false;
10736
+ }
10737
+
10664
10738
  hasVideo(callSession ) {
10665
10739
  return this.phone ? this.phone.hasVideo(callSession) : false;
10666
10740
  }
@@ -10820,6 +10894,7 @@ const AGENT_PAUSED = 'agent_paused';
10820
10894
  const AGENT_UNPAUSED = 'agent_unpaused';
10821
10895
  const CONFERENCE_ADHOC_PARTICIPANT_LEFT = 'conference_adhoc_participant_left';
10822
10896
  const CONFERENCE_ADHOC_DELETED = 'conference_adhoc_deleted';
10897
+ const MEETING_USER_PROGRESS = 'meeting_user_progress';
10823
10898
 
10824
10899
  const BLACKLIST_EVENTS = [
10825
10900
  CHAT_MESSAGE_SENT,
@@ -11170,6 +11245,7 @@ WebSocketClient.eventLists = [
11170
11245
  AGENT_UNPAUSED,
11171
11246
  CONFERENCE_ADHOC_PARTICIPANT_LEFT,
11172
11247
  CONFERENCE_ADHOC_DELETED,
11248
+ MEETING_USER_PROGRESS,
11173
11249
  ];
11174
11250
 
11175
11251
  var WebSocketClient$1 = /*#__PURE__*/Object.freeze({
@@ -11240,6 +11316,7 @@ var WebSocketClient$1 = /*#__PURE__*/Object.freeze({
11240
11316
  AGENT_UNPAUSED: AGENT_UNPAUSED,
11241
11317
  CONFERENCE_ADHOC_PARTICIPANT_LEFT: CONFERENCE_ADHOC_PARTICIPANT_LEFT,
11242
11318
  CONFERENCE_ADHOC_DELETED: CONFERENCE_ADHOC_DELETED,
11319
+ MEETING_USER_PROGRESS: MEETING_USER_PROGRESS,
11243
11320
  HEARTBEAT_ENGINE_VERSION: HEARTBEAT_ENGINE_VERSION,
11244
11321
  'default': WebSocketClient
11245
11322
  });
@@ -26,4 +26,4 @@ class Emitter {
26
26
  }
27
27
  }
28
28
 
29
- export { Emitter as default };
29
+ export default Emitter;
@@ -93,4 +93,4 @@ class Heartbeat {
93
93
  }
94
94
  }
95
95
 
96
- export { Heartbeat as default };
96
+ export default Heartbeat;