@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
@@ -1,6 +1,6 @@
1
1
  import { Base64 } from 'js-base64';
2
2
  import moment from 'moment';
3
- import { KEYUTIL, jws, b64utoutf8 } from 'jsrsasign';
3
+ import { jws, b64utoutf8, KEYUTIL } from 'jsrsasign';
4
4
  import { SessionState } from 'sip.js/lib/api/session-state';
5
5
  import EventEmitter from 'events';
6
6
  import { jsonToGraphQLQuery } from 'json-to-graphql-query/lib/jsonToGraphQLQuery';
@@ -148,6 +148,7 @@ class IssueReporter {
148
148
 
149
149
 
150
150
 
151
+
151
152
 
152
153
  constructor() {
153
154
  addLevelsTo(this);
@@ -159,12 +160,17 @@ class IssueReporter {
159
160
  this.bufferTimeout = null;
160
161
  this._boundProcessBuffer = this._processBuffer.bind(this);
161
162
  this._boundParseLoggerBody = this._parseLoggerBody.bind(this);
163
+ this._callback = null;
162
164
  }
163
165
 
164
166
  init() {
165
167
  this._catchConsole();
166
168
  }
167
169
 
170
+ setCallback(cb ) {
171
+ this._callback = cb;
172
+ }
173
+
168
174
  configureRemoteClient(configuration = { tag: 'wazo-sdk', host: null, port: null, level: null, extra: {} }) {
169
175
  this.remoteClientConfiguration = configuration;
170
176
  }
@@ -200,6 +206,7 @@ class IssueReporter {
200
206
 
201
207
  // Handle category label
202
208
  let category = null;
209
+ let skipSendToRemote = false;
203
210
  let extra = {};
204
211
  if (args[0].indexOf(CATEGORY_PREFIX) === 0) {
205
212
  category = args[0].split('=')[1];
@@ -215,6 +222,7 @@ class IssueReporter {
215
222
  errorMessage: lastArg.message,
216
223
  errorStack: lastArg.stack,
217
224
  errorType: lastArg.constructor.name,
225
+ skipSendToRemote: lastArg.skipSendToRemote,
218
226
  };
219
227
  } else {
220
228
  extra = lastArg;
@@ -223,6 +231,11 @@ class IssueReporter {
223
231
  args.splice(1, 1);
224
232
  }
225
233
 
234
+ if (extra.skipSendToRemote) {
235
+ skipSendToRemote = true;
236
+ delete extra.skipSendToRemote;
237
+ }
238
+
226
239
  const date = moment().format('YYYY-MM-DD HH:mm:ss.SSS');
227
240
  const message = args.join(', ');
228
241
  let consoleMessage = message;
@@ -243,7 +256,13 @@ class IssueReporter {
243
256
  const oldMethod = this.oldConsoleMethods[consoleLevel] || this.oldConsoleMethods.log;
244
257
  oldMethod.apply(oldMethod, [date, consoleMessage]);
245
258
 
246
- this._sendToRemoteLogger(level, { date, message, category, ...extra });
259
+ if (this._callback) {
260
+ this._callback(level, consoleMessage);
261
+ }
262
+
263
+ if (!skipSendToRemote) {
264
+ this._sendToRemoteLogger(level, { date, message, category, ...extra });
265
+ }
247
266
  }
248
267
 
249
268
  logRequest(url , options , response , start ) {
@@ -388,7 +407,11 @@ class IssueReporter {
388
407
  },
389
408
  // $FlowFixMe
390
409
  body,
391
- }).catch(() => {
410
+ }).catch((e ) => {
411
+ // $FlowFixMe
412
+ e.skipSendToRemote = true;
413
+ this.log('error', this._makeCategory('grafana'), 'Sending log to grafana, error', e);
414
+
392
415
  setTimeout(() => {
393
416
  if (isArray) {
394
417
  payload = payload.map(message => {
@@ -400,7 +423,7 @@ class IssueReporter {
400
423
  payload._retry = retry + 1;
401
424
  }
402
425
 
403
- this._sendDebugToGrafana(body, retry + 1);
426
+ this._sendDebugToGrafana(payload, retry + 1);
404
427
  }, 5000 + retry * 1000);
405
428
  });
406
429
  }
@@ -2603,7 +2626,8 @@ class ExternalApp {
2603
2626
 
2604
2627
 
2605
2628
 
2606
-
2629
+
2630
+
2607
2631
 
2608
2632
 
2609
2633
  class Meeting {
@@ -2615,6 +2639,7 @@ class Meeting {
2615
2639
 
2616
2640
 
2617
2641
 
2642
+
2618
2643
 
2619
2644
 
2620
2645
  static parse(plain ) {
@@ -2626,14 +2651,28 @@ class Meeting {
2626
2651
  port: plain.port,
2627
2652
  uuid: plain.uuid,
2628
2653
  number: plain.number,
2654
+ persistent: plain.persistent,
2629
2655
  });
2630
2656
  }
2631
2657
 
2658
+ static parseMany(items ) {
2659
+ return items.map(plain => Meeting.parse(plain));
2660
+ }
2661
+
2632
2662
  static newFrom(meeting ) {
2633
2663
  return newFrom(meeting, Meeting);
2634
2664
  }
2635
2665
 
2636
- constructor({ uuid, name, guestSipAuthorization, ownerUuids, port, uri, number } = {}) {
2666
+ constructor({
2667
+ uuid,
2668
+ name,
2669
+ guestSipAuthorization,
2670
+ ownerUuids,
2671
+ port,
2672
+ uri,
2673
+ number,
2674
+ persistent,
2675
+ } = {}) {
2637
2676
  this.guestSipAuthorization = guestSipAuthorization;
2638
2677
  this.uri = uri;
2639
2678
  this.name = name;
@@ -2641,6 +2680,7 @@ class Meeting {
2641
2680
  this.port = port;
2642
2681
  this.uuid = uuid;
2643
2682
  this.number = number;
2683
+ this.persistent = persistent;
2644
2684
 
2645
2685
  // Useful to compare instead of instanceof with minified code
2646
2686
  this.type = 'Meeting';
@@ -2718,8 +2758,11 @@ var confdMethods = (client , baseUrl ) => ({
2718
2758
  }
2719
2759
  },
2720
2760
 
2721
- createMyMeeting: (name ) =>
2722
- client.post(`${baseUrl}/users/me/meetings`, { name }).then(Meeting.parse),
2761
+ getMyMeetings: () =>
2762
+ client.get(`${baseUrl}/users/me/meetings`).then(response => Meeting.parseMany(response.items)),
2763
+
2764
+ createMyMeeting: (name , persistent ) =>
2765
+ client.post(`${baseUrl}/users/me/meetings`, { name, persistent }).then(Meeting.parse),
2723
2766
 
2724
2767
  deleteMyMeeting: (meetingUuid ) =>
2725
2768
  client.delete(`${baseUrl}/users/me/meetings/${meetingUuid}`, null),
@@ -3230,7 +3273,7 @@ class Recording {
3230
3273
 
3231
3274
 
3232
3275
 
3233
- static parseMany(recordings ) {
3276
+ static parseMany(recordings = []) {
3234
3277
  return recordings.map(item => Recording.parse(item));
3235
3278
  }
3236
3279
 
@@ -3356,7 +3399,7 @@ class CallLog {
3356
3399
  duration: (plain.duration || 0) * 1000, // duration is in seconds
3357
3400
  start: moment(plain.start).toDate(),
3358
3401
  end: plain.end ? moment(plain.end).toDate() : null,
3359
- recordings: Recording.parseMany(plain.recordings),
3402
+ recordings: Recording.parseMany(plain.recordings || []),
3360
3403
  });
3361
3404
  }
3362
3405
 
@@ -4899,6 +4942,7 @@ const AGENT_PAUSED = 'agent_paused';
4899
4942
  const AGENT_UNPAUSED = 'agent_unpaused';
4900
4943
  const CONFERENCE_ADHOC_PARTICIPANT_LEFT = 'conference_adhoc_participant_left';
4901
4944
  const CONFERENCE_ADHOC_DELETED = 'conference_adhoc_deleted';
4945
+ const MEETING_USER_PROGRESS = 'meeting_user_progress';
4902
4946
 
4903
4947
  const BLACKLIST_EVENTS = [
4904
4948
  CHAT_MESSAGE_SENT,
@@ -5249,6 +5293,7 @@ WebSocketClient.eventLists = [
5249
5293
  AGENT_UNPAUSED,
5250
5294
  CONFERENCE_ADHOC_PARTICIPANT_LEFT,
5251
5295
  CONFERENCE_ADHOC_DELETED,
5296
+ MEETING_USER_PROGRESS,
5252
5297
  ];
5253
5298
 
5254
5299
  var wazoWebsocket = {
@@ -6277,7 +6322,9 @@ class WebRTCClient extends Emitter {
6277
6322
  const inviteOptions = {
6278
6323
  requestDelegate: {
6279
6324
  onAccept: (response ) => {
6280
- session.sessionDescriptionHandler.peerConnection.sfu = conference;
6325
+ if (session.sessionDescriptionHandler.peerConnection) {
6326
+ session.sessionDescriptionHandler.peerConnection.sfu = conference;
6327
+ }
6281
6328
  this._onAccepted(session, response.session, true);
6282
6329
  },
6283
6330
  onReject: (response ) => {
@@ -6613,7 +6660,7 @@ class WebRTCClient extends Emitter {
6613
6660
  // We search for the last transceiver without `video-` in the mid (video- means remote transceiver)
6614
6661
  const transceivers = pc.getTransceivers();
6615
6662
  const transceiverIdx = lastIndexOf(transceivers, transceiver =>
6616
- transceiver.sender.track === null && transceiver.mid.indexOf('video') === -1);
6663
+ transceiver.sender.track === null && transceiver.mid && transceiver.mid.indexOf('video') === -1);
6617
6664
 
6618
6665
  videoSender = transceiverIdx !== -1 ? transceivers[transceiverIdx].sender : null;
6619
6666
  } else {
@@ -7149,6 +7196,16 @@ class WebRTCClient extends Emitter {
7149
7196
  return this.hasRemoteVideo(sessionId) ? this.getRemoteStream(sessionId) : null;
7150
7197
  }
7151
7198
 
7199
+ // Useful in a react-native environment when remoteMediaStream is not updated
7200
+ getRemoteVideoStreamFromPc(sessionId ) {
7201
+ const pc = this.getPeerConnection(sessionId);
7202
+ if (!pc) {
7203
+ return null;
7204
+ }
7205
+
7206
+ return pc.getRemoteStreams().find(stream => !!stream.getVideoTracks().length);
7207
+ }
7208
+
7152
7209
  hasVideo(sessionId ) {
7153
7210
  return this.hasLocalVideo(sessionId) || this.hasRemoteVideo(sessionId);
7154
7211
  }
@@ -7659,6 +7716,7 @@ class WebRTCClient extends Emitter {
7659
7716
  session.sessionDescriptionHandler.remoteMediaStream.onaddtrack = onTrack;
7660
7717
 
7661
7718
  pc.oniceconnectionstatechange = () => {
7719
+ logger.info('on ice connection state changed', { state: pc.iceConnectionState });
7662
7720
  if (pc.iceConnectionState === 'disconnected') {
7663
7721
  this.eventEmitter.emit(ON_DISCONNECTED);
7664
7722
  }
@@ -7927,18 +7985,22 @@ class WebRTCClient extends Emitter {
7927
7985
  });
7928
7986
 
7929
7987
  networkStats.packetsLost = packetsLost;
7930
- networkStats.audioBytesSent = audioBytesSent;
7988
+ networkStats.totalAudioBytesSent = audioBytesSent;
7989
+ networkStats.audioBytesSent = audioBytesSent - lastAudioSent;
7990
+ networkStats.totalAudioBytesReceived = audioBytesReceived - lastAudioReceived;
7931
7991
  networkStats.audioBytesReceived = audioBytesReceived;
7932
- networkStats.videoBytesSent = videoBytesSent;
7933
- networkStats.videoBytesReceived = videoBytesReceived;
7992
+ networkStats.totalVideoBytesSent = videoBytesSent;
7993
+ networkStats.videoBytesSent = videoBytesSent - lastVideoSent;
7994
+ networkStats.totalVideoBytesReceived = videoBytesReceived;
7995
+ networkStats.videoBytesReceived = videoBytesReceived - lastVideoReceived;
7996
+ networkStats.totalTransportSent = transportSent - lastTransportSent;
7934
7997
  networkStats.transportSent = transportSent;
7935
- networkStats.transportReceived = transportReceived;
7936
-
7937
- const bandwidth = (networkStats.audioBytesSent - lastAudioSent) + (networkStats.videoBytesSent - lastVideoSent)
7938
- + (networkStats.audioBytesReceived - lastAudioReceived) + (networkStats.videoBytesReceived - lastVideoReceived)
7939
- + (networkStats.transportReceived - lastTransportReceived) + (networkStats.transportSent - lastTransportSent);
7998
+ networkStats.totalTransportReceived = transportReceived;
7999
+ networkStats.transportReceived = transportReceived - lastTransportReceived;
7940
8000
 
7941
- networkStats.bandwidth = bandwidth;
8001
+ networkStats.bandwidth = networkStats.audioBytesSent + networkStats.audioBytesReceived
8002
+ + networkStats.videoBytesSent + networkStats.videoBytesReceived + networkStats.transportReceived
8003
+ + networkStats.transportSent;
7942
8004
 
7943
8005
  this.eventEmitter.emit(ON_NETWORK_STATS, session, networkStats, this.sessionNetworkStats[sessionId]);
7944
8006
  this.sessionNetworkStats[sessionId].push(networkStats);
@@ -8223,4 +8285,4 @@ var index = [
8223
8285
  iceIpv4,
8224
8286
  ];
8225
8287
 
8226
- export { index as default };
8288
+ export default index;
@@ -101,4 +101,4 @@ var symmetricNat = {
101
101
  }),
102
102
  };
103
103
 
104
- export { symmetricNat as default };
104
+ export default symmetricNat;
@@ -121,6 +121,7 @@ class IssueReporter {
121
121
 
122
122
 
123
123
 
124
+
124
125
 
125
126
  constructor() {
126
127
  addLevelsTo(this);
@@ -132,12 +133,17 @@ class IssueReporter {
132
133
  this.bufferTimeout = null;
133
134
  this._boundProcessBuffer = this._processBuffer.bind(this);
134
135
  this._boundParseLoggerBody = this._parseLoggerBody.bind(this);
136
+ this._callback = null;
135
137
  }
136
138
 
137
139
  init() {
138
140
  this._catchConsole();
139
141
  }
140
142
 
143
+ setCallback(cb ) {
144
+ this._callback = cb;
145
+ }
146
+
141
147
  configureRemoteClient(configuration = { tag: 'wazo-sdk', host: null, port: null, level: null, extra: {} }) {
142
148
  this.remoteClientConfiguration = configuration;
143
149
  }
@@ -173,6 +179,7 @@ class IssueReporter {
173
179
 
174
180
  // Handle category label
175
181
  let category = null;
182
+ let skipSendToRemote = false;
176
183
  let extra = {};
177
184
  if (args[0].indexOf(CATEGORY_PREFIX) === 0) {
178
185
  category = args[0].split('=')[1];
@@ -188,6 +195,7 @@ class IssueReporter {
188
195
  errorMessage: lastArg.message,
189
196
  errorStack: lastArg.stack,
190
197
  errorType: lastArg.constructor.name,
198
+ skipSendToRemote: lastArg.skipSendToRemote,
191
199
  };
192
200
  } else {
193
201
  extra = lastArg;
@@ -196,6 +204,11 @@ class IssueReporter {
196
204
  args.splice(1, 1);
197
205
  }
198
206
 
207
+ if (extra.skipSendToRemote) {
208
+ skipSendToRemote = true;
209
+ delete extra.skipSendToRemote;
210
+ }
211
+
199
212
  const date = moment().format('YYYY-MM-DD HH:mm:ss.SSS');
200
213
  const message = args.join(', ');
201
214
  let consoleMessage = message;
@@ -216,7 +229,13 @@ class IssueReporter {
216
229
  const oldMethod = this.oldConsoleMethods[consoleLevel] || this.oldConsoleMethods.log;
217
230
  oldMethod.apply(oldMethod, [date, consoleMessage]);
218
231
 
219
- this._sendToRemoteLogger(level, { date, message, category, ...extra });
232
+ if (this._callback) {
233
+ this._callback(level, consoleMessage);
234
+ }
235
+
236
+ if (!skipSendToRemote) {
237
+ this._sendToRemoteLogger(level, { date, message, category, ...extra });
238
+ }
220
239
  }
221
240
 
222
241
  logRequest(url , options , response , start ) {
@@ -361,7 +380,11 @@ class IssueReporter {
361
380
  },
362
381
  // $FlowFixMe
363
382
  body,
364
- }).catch(() => {
383
+ }).catch((e ) => {
384
+ // $FlowFixMe
385
+ e.skipSendToRemote = true;
386
+ this.log('error', this._makeCategory('grafana'), 'Sending log to grafana, error', e);
387
+
365
388
  setTimeout(() => {
366
389
  if (isArray) {
367
390
  payload = payload.map(message => {
@@ -373,7 +396,7 @@ class IssueReporter {
373
396
  payload._retry = retry + 1;
374
397
  }
375
398
 
376
- this._sendDebugToGrafana(body, retry + 1);
399
+ this._sendDebugToGrafana(payload, retry + 1);
377
400
  }, 5000 + retry * 1000);
378
401
  });
379
402
  }
@@ -578,6 +601,7 @@ const AGENT_PAUSED = 'agent_paused';
578
601
  const AGENT_UNPAUSED = 'agent_unpaused';
579
602
  const CONFERENCE_ADHOC_PARTICIPANT_LEFT = 'conference_adhoc_participant_left';
580
603
  const CONFERENCE_ADHOC_DELETED = 'conference_adhoc_deleted';
604
+ const MEETING_USER_PROGRESS = 'meeting_user_progress';
581
605
 
582
606
  const BLACKLIST_EVENTS = [
583
607
  CHAT_MESSAGE_SENT,
@@ -928,6 +952,7 @@ WebSocketClient.eventLists = [
928
952
  AGENT_UNPAUSED,
929
953
  CONFERENCE_ADHOC_PARTICIPANT_LEFT,
930
954
  CONFERENCE_ADHOC_DELETED,
955
+ MEETING_USER_PROGRESS,
931
956
  ];
932
957
 
933
958
  var wazoWebsocket = {
@@ -968,4 +993,4 @@ var wazoWebsocket = {
968
993
  }),
969
994
  };
970
995
 
971
- export { wazoWebsocket as default };
996
+ export default wazoWebsocket;
@@ -19,7 +19,7 @@ import 'sip.js/lib/platform/web/session-description-handler/session-description-
19
19
  import moment from 'moment';
20
20
  import { Base64 } from 'js-base64';
21
21
  import sdpParser from 'sdp-transform';
22
- import { KEYUTIL, jws, b64utoutf8 } from 'jsrsasign';
22
+ import { jws, b64utoutf8, KEYUTIL } from 'jsrsasign';
23
23
  import { jsonToGraphQLQuery } from 'json-to-graphql-query/lib/jsonToGraphQLQuery';
24
24
 
25
25
  /* */
@@ -412,6 +412,7 @@ class IssueReporter {
412
412
 
413
413
 
414
414
 
415
+
415
416
 
416
417
  constructor() {
417
418
  addLevelsTo(this);
@@ -423,12 +424,17 @@ class IssueReporter {
423
424
  this.bufferTimeout = null;
424
425
  this._boundProcessBuffer = this._processBuffer.bind(this);
425
426
  this._boundParseLoggerBody = this._parseLoggerBody.bind(this);
427
+ this._callback = null;
426
428
  }
427
429
 
428
430
  init() {
429
431
  this._catchConsole();
430
432
  }
431
433
 
434
+ setCallback(cb ) {
435
+ this._callback = cb;
436
+ }
437
+
432
438
  configureRemoteClient(configuration = { tag: 'wazo-sdk', host: null, port: null, level: null, extra: {} }) {
433
439
  this.remoteClientConfiguration = configuration;
434
440
  }
@@ -464,6 +470,7 @@ class IssueReporter {
464
470
 
465
471
  // Handle category label
466
472
  let category = null;
473
+ let skipSendToRemote = false;
467
474
  let extra = {};
468
475
  if (args[0].indexOf(CATEGORY_PREFIX) === 0) {
469
476
  category = args[0].split('=')[1];
@@ -479,6 +486,7 @@ class IssueReporter {
479
486
  errorMessage: lastArg.message,
480
487
  errorStack: lastArg.stack,
481
488
  errorType: lastArg.constructor.name,
489
+ skipSendToRemote: lastArg.skipSendToRemote,
482
490
  };
483
491
  } else {
484
492
  extra = lastArg;
@@ -487,6 +495,11 @@ class IssueReporter {
487
495
  args.splice(1, 1);
488
496
  }
489
497
 
498
+ if (extra.skipSendToRemote) {
499
+ skipSendToRemote = true;
500
+ delete extra.skipSendToRemote;
501
+ }
502
+
490
503
  const date = moment().format('YYYY-MM-DD HH:mm:ss.SSS');
491
504
  const message = args.join(', ');
492
505
  let consoleMessage = message;
@@ -507,7 +520,13 @@ class IssueReporter {
507
520
  const oldMethod = this.oldConsoleMethods[consoleLevel] || this.oldConsoleMethods.log;
508
521
  oldMethod.apply(oldMethod, [date, consoleMessage]);
509
522
 
510
- this._sendToRemoteLogger(level, { date, message, category, ...extra });
523
+ if (this._callback) {
524
+ this._callback(level, consoleMessage);
525
+ }
526
+
527
+ if (!skipSendToRemote) {
528
+ this._sendToRemoteLogger(level, { date, message, category, ...extra });
529
+ }
511
530
  }
512
531
 
513
532
  logRequest(url , options , response , start ) {
@@ -652,7 +671,11 @@ class IssueReporter {
652
671
  },
653
672
  // $FlowFixMe
654
673
  body,
655
- }).catch(() => {
674
+ }).catch((e ) => {
675
+ // $FlowFixMe
676
+ e.skipSendToRemote = true;
677
+ this.log('error', this._makeCategory('grafana'), 'Sending log to grafana, error', e);
678
+
656
679
  setTimeout(() => {
657
680
  if (isArray) {
658
681
  payload = payload.map(message => {
@@ -664,7 +687,7 @@ class IssueReporter {
664
687
  payload._retry = retry + 1;
665
688
  }
666
689
 
667
- this._sendDebugToGrafana(body, retry + 1);
690
+ this._sendDebugToGrafana(payload, retry + 1);
668
691
  }, 5000 + retry * 1000);
669
692
  });
670
693
  }
@@ -3166,7 +3189,8 @@ class ExternalApp {
3166
3189
 
3167
3190
 
3168
3191
 
3169
-
3192
+
3193
+
3170
3194
 
3171
3195
 
3172
3196
  class Meeting {
@@ -3178,6 +3202,7 @@ class Meeting {
3178
3202
 
3179
3203
 
3180
3204
 
3205
+
3181
3206
 
3182
3207
 
3183
3208
  static parse(plain ) {
@@ -3189,14 +3214,28 @@ class Meeting {
3189
3214
  port: plain.port,
3190
3215
  uuid: plain.uuid,
3191
3216
  number: plain.number,
3217
+ persistent: plain.persistent,
3192
3218
  });
3193
3219
  }
3194
3220
 
3221
+ static parseMany(items ) {
3222
+ return items.map(plain => Meeting.parse(plain));
3223
+ }
3224
+
3195
3225
  static newFrom(meeting ) {
3196
3226
  return newFrom(meeting, Meeting);
3197
3227
  }
3198
3228
 
3199
- constructor({ uuid, name, guestSipAuthorization, ownerUuids, port, uri, number } = {}) {
3229
+ constructor({
3230
+ uuid,
3231
+ name,
3232
+ guestSipAuthorization,
3233
+ ownerUuids,
3234
+ port,
3235
+ uri,
3236
+ number,
3237
+ persistent,
3238
+ } = {}) {
3200
3239
  this.guestSipAuthorization = guestSipAuthorization;
3201
3240
  this.uri = uri;
3202
3241
  this.name = name;
@@ -3204,6 +3243,7 @@ class Meeting {
3204
3243
  this.port = port;
3205
3244
  this.uuid = uuid;
3206
3245
  this.number = number;
3246
+ this.persistent = persistent;
3207
3247
 
3208
3248
  // Useful to compare instead of instanceof with minified code
3209
3249
  this.type = 'Meeting';
@@ -3281,8 +3321,11 @@ var confdMethods = (client , baseUrl ) => ({
3281
3321
  }
3282
3322
  },
3283
3323
 
3284
- createMyMeeting: (name ) =>
3285
- client.post(`${baseUrl}/users/me/meetings`, { name }).then(Meeting.parse),
3324
+ getMyMeetings: () =>
3325
+ client.get(`${baseUrl}/users/me/meetings`).then(response => Meeting.parseMany(response.items)),
3326
+
3327
+ createMyMeeting: (name , persistent ) =>
3328
+ client.post(`${baseUrl}/users/me/meetings`, { name, persistent }).then(Meeting.parse),
3286
3329
 
3287
3330
  deleteMyMeeting: (meetingUuid ) =>
3288
3331
  client.delete(`${baseUrl}/users/me/meetings/${meetingUuid}`, null),
@@ -3767,7 +3810,7 @@ class Recording {
3767
3810
 
3768
3811
 
3769
3812
 
3770
- static parseMany(recordings ) {
3813
+ static parseMany(recordings = []) {
3771
3814
  return recordings.map(item => Recording.parse(item));
3772
3815
  }
3773
3816
 
@@ -3893,7 +3936,7 @@ class CallLog {
3893
3936
  duration: (plain.duration || 0) * 1000, // duration is in seconds
3894
3937
  start: moment(plain.start).toDate(),
3895
3938
  end: plain.end ? moment(plain.end).toDate() : null,
3896
- recordings: Recording.parseMany(plain.recordings),
3939
+ recordings: Recording.parseMany(plain.recordings || []),
3897
3940
  });
3898
3941
  }
3899
3942
 
@@ -5694,7 +5737,9 @@ class WebRTCClient extends Emitter {
5694
5737
  const inviteOptions = {
5695
5738
  requestDelegate: {
5696
5739
  onAccept: (response ) => {
5697
- session.sessionDescriptionHandler.peerConnection.sfu = conference;
5740
+ if (session.sessionDescriptionHandler.peerConnection) {
5741
+ session.sessionDescriptionHandler.peerConnection.sfu = conference;
5742
+ }
5698
5743
  this._onAccepted(session, response.session, true);
5699
5744
  },
5700
5745
  onReject: (response ) => {
@@ -6030,7 +6075,7 @@ class WebRTCClient extends Emitter {
6030
6075
  // We search for the last transceiver without `video-` in the mid (video- means remote transceiver)
6031
6076
  const transceivers = pc.getTransceivers();
6032
6077
  const transceiverIdx = lastIndexOf(transceivers, transceiver =>
6033
- transceiver.sender.track === null && transceiver.mid.indexOf('video') === -1);
6078
+ transceiver.sender.track === null && transceiver.mid && transceiver.mid.indexOf('video') === -1);
6034
6079
 
6035
6080
  videoSender = transceiverIdx !== -1 ? transceivers[transceiverIdx].sender : null;
6036
6081
  } else {
@@ -6566,6 +6611,16 @@ class WebRTCClient extends Emitter {
6566
6611
  return this.hasRemoteVideo(sessionId) ? this.getRemoteStream(sessionId) : null;
6567
6612
  }
6568
6613
 
6614
+ // Useful in a react-native environment when remoteMediaStream is not updated
6615
+ getRemoteVideoStreamFromPc(sessionId ) {
6616
+ const pc = this.getPeerConnection(sessionId);
6617
+ if (!pc) {
6618
+ return null;
6619
+ }
6620
+
6621
+ return pc.getRemoteStreams().find(stream => !!stream.getVideoTracks().length);
6622
+ }
6623
+
6569
6624
  hasVideo(sessionId ) {
6570
6625
  return this.hasLocalVideo(sessionId) || this.hasRemoteVideo(sessionId);
6571
6626
  }
@@ -7076,6 +7131,7 @@ class WebRTCClient extends Emitter {
7076
7131
  session.sessionDescriptionHandler.remoteMediaStream.onaddtrack = onTrack;
7077
7132
 
7078
7133
  pc.oniceconnectionstatechange = () => {
7134
+ logger.info('on ice connection state changed', { state: pc.iceConnectionState });
7079
7135
  if (pc.iceConnectionState === 'disconnected') {
7080
7136
  this.eventEmitter.emit(ON_DISCONNECTED);
7081
7137
  }
@@ -7344,18 +7400,22 @@ class WebRTCClient extends Emitter {
7344
7400
  });
7345
7401
 
7346
7402
  networkStats.packetsLost = packetsLost;
7347
- networkStats.audioBytesSent = audioBytesSent;
7403
+ networkStats.totalAudioBytesSent = audioBytesSent;
7404
+ networkStats.audioBytesSent = audioBytesSent - lastAudioSent;
7405
+ networkStats.totalAudioBytesReceived = audioBytesReceived - lastAudioReceived;
7348
7406
  networkStats.audioBytesReceived = audioBytesReceived;
7349
- networkStats.videoBytesSent = videoBytesSent;
7350
- networkStats.videoBytesReceived = videoBytesReceived;
7407
+ networkStats.totalVideoBytesSent = videoBytesSent;
7408
+ networkStats.videoBytesSent = videoBytesSent - lastVideoSent;
7409
+ networkStats.totalVideoBytesReceived = videoBytesReceived;
7410
+ networkStats.videoBytesReceived = videoBytesReceived - lastVideoReceived;
7411
+ networkStats.totalTransportSent = transportSent - lastTransportSent;
7351
7412
  networkStats.transportSent = transportSent;
7352
- networkStats.transportReceived = transportReceived;
7353
-
7354
- const bandwidth = (networkStats.audioBytesSent - lastAudioSent) + (networkStats.videoBytesSent - lastVideoSent)
7355
- + (networkStats.audioBytesReceived - lastAudioReceived) + (networkStats.videoBytesReceived - lastVideoReceived)
7356
- + (networkStats.transportReceived - lastTransportReceived) + (networkStats.transportSent - lastTransportSent);
7413
+ networkStats.totalTransportReceived = transportReceived;
7414
+ networkStats.transportReceived = transportReceived - lastTransportReceived;
7357
7415
 
7358
- networkStats.bandwidth = bandwidth;
7416
+ networkStats.bandwidth = networkStats.audioBytesSent + networkStats.audioBytesReceived
7417
+ + networkStats.videoBytesSent + networkStats.videoBytesReceived + networkStats.transportReceived
7418
+ + networkStats.transportSent;
7359
7419
 
7360
7420
  this.eventEmitter.emit(ON_NETWORK_STATS, session, networkStats, this.sessionNetworkStats[sessionId]);
7361
7421
  this.sessionNetworkStats[sessionId].push(networkStats);
@@ -7400,4 +7460,4 @@ var webrtcTransport = {
7400
7460
  }),
7401
7461
  };
7402
7462
 
7403
- export { webrtcTransport as default };
7463
+ export default webrtcTransport;