@wazo/sdk 0.37.19 → 0.37.23

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 (142) hide show
  1. package/dist/wazo-sdk.js +5 -5
  2. package/esm/__tests__/api-client.test.js +70 -5
  3. package/esm/__tests__/web-rtc-client.test.js +111 -67
  4. package/esm/api/agentd.js +25 -2
  5. package/esm/api/amid.js +25 -2
  6. package/esm/api/application.js +25 -2
  7. package/esm/api/auth.js +25 -2
  8. package/esm/api/call-logd.js +32 -2
  9. package/esm/api/calld.js +35 -2
  10. package/esm/api/chatd.js +32 -2
  11. package/esm/api/confd.js +47 -5
  12. package/esm/api/ctid-ng.js +35 -2
  13. package/esm/api/dird.js +28 -2
  14. package/esm/api/webhookd.js +25 -2
  15. package/esm/api-client.js +70 -5
  16. package/esm/checker/Checker.js +113 -67
  17. package/esm/checker/checks/aor.js +70 -5
  18. package/esm/checker/checks/api.js +70 -5
  19. package/esm/checker/checks/index.js +113 -67
  20. package/esm/checker/checks/wazo-websocket.js +27 -2
  21. package/esm/checker/checks/webrtc-transport.js +111 -67
  22. package/esm/checker/checks/webrtc.js +111 -67
  23. package/esm/domain/AdHocAPIConference.js +70 -5
  24. package/esm/domain/Call.js +3 -0
  25. package/esm/domain/CallLog.js +7 -0
  26. package/esm/domain/ChatMessage.js +4 -0
  27. package/esm/domain/ChatRoom.js +3 -0
  28. package/esm/domain/Contact.js +3 -0
  29. package/esm/domain/Features.js +70 -5
  30. package/esm/domain/Meeting.js +17 -1
  31. package/esm/domain/Phone/CTIPhone.js +74 -5
  32. package/esm/domain/Phone/WebRTCPhone.js +50 -16
  33. package/esm/domain/Recording.js +3 -0
  34. package/esm/domain/Voicemail.js +3 -0
  35. package/esm/domain/__tests__/Call.test.js +3 -0
  36. package/esm/domain/__tests__/CallLog.test.js +7 -0
  37. package/esm/domain/__tests__/Contact.test.js +3 -0
  38. package/esm/domain/__tests__/Voicemail.test.js +3 -0
  39. package/esm/index.js +147 -80
  40. package/esm/lib/WazoSessionDescriptionHandler.js +25 -40
  41. package/esm/service/CallApi.js +70 -5
  42. package/esm/service/IssueReporter.js +25 -2
  43. package/esm/service/__tests__/IssueReporter.test.js +25 -2
  44. package/esm/service/getApiClient.js +70 -5
  45. package/esm/simple/Auth.js +147 -80
  46. package/esm/simple/Configuration.js +147 -80
  47. package/esm/simple/Directory.js +70 -5
  48. package/esm/simple/Phone.js +147 -80
  49. package/esm/simple/Websocket.js +28 -2
  50. package/esm/simple/index.js +147 -80
  51. package/esm/simple/room/LocalParticipant.js +147 -80
  52. package/esm/simple/room/Participant.js +147 -80
  53. package/esm/simple/room/RemoteParticipant.js +147 -80
  54. package/esm/simple/room/Room.js +147 -80
  55. package/esm/simple/room/SipRoom.js +147 -80
  56. package/esm/simple/room/Stream.js +147 -80
  57. package/esm/simple/room/__tests__/RemoteParticipant.test.js +147 -80
  58. package/esm/simple/utils.js +147 -80
  59. package/esm/utils/__tests__/api-requester.test.js +25 -2
  60. package/esm/utils/api-requester.js +25 -2
  61. package/esm/web-rtc-client.js +111 -67
  62. package/esm/websocket-client.js +28 -3
  63. package/lib/__tests__/api-client.test.js +70 -5
  64. package/lib/__tests__/web-rtc-client.test.js +111 -67
  65. package/lib/api/agentd.js +25 -2
  66. package/lib/api/amid.js +25 -2
  67. package/lib/api/application.js +25 -2
  68. package/lib/api/auth.js +25 -2
  69. package/lib/api/call-logd.js +32 -2
  70. package/lib/api/calld.js +35 -2
  71. package/lib/api/chatd.js +32 -2
  72. package/lib/api/confd.js +47 -5
  73. package/lib/api/ctid-ng.js +35 -2
  74. package/lib/api/dird.js +28 -2
  75. package/lib/api/webhookd.js +25 -2
  76. package/lib/api-client.js +70 -5
  77. package/lib/checker/Checker.js +113 -67
  78. package/lib/checker/checks/aor.js +70 -5
  79. package/lib/checker/checks/api.js +70 -5
  80. package/lib/checker/checks/index.js +113 -67
  81. package/lib/checker/checks/wazo-websocket.js +27 -2
  82. package/lib/checker/checks/webrtc-transport.js +111 -67
  83. package/lib/checker/checks/webrtc.js +111 -67
  84. package/lib/domain/AdHocAPIConference.js +70 -5
  85. package/lib/domain/Call.js +3 -0
  86. package/lib/domain/CallLog.js +7 -0
  87. package/lib/domain/ChatMessage.js +4 -0
  88. package/lib/domain/ChatRoom.js +3 -0
  89. package/lib/domain/Contact.js +3 -0
  90. package/lib/domain/Features.js +70 -5
  91. package/lib/domain/Meeting.js +17 -1
  92. package/lib/domain/Phone/CTIPhone.js +74 -5
  93. package/lib/domain/Phone/WebRTCPhone.js +50 -16
  94. package/lib/domain/Recording.js +3 -0
  95. package/lib/domain/Voicemail.js +3 -0
  96. package/lib/domain/__tests__/Call.test.js +3 -0
  97. package/lib/domain/__tests__/CallLog.test.js +7 -0
  98. package/lib/domain/__tests__/Contact.test.js +3 -0
  99. package/lib/domain/__tests__/Voicemail.test.js +3 -0
  100. package/lib/index.js +147 -80
  101. package/lib/lib/WazoSessionDescriptionHandler.js +25 -40
  102. package/lib/service/CallApi.js +70 -5
  103. package/lib/service/IssueReporter.js +25 -2
  104. package/lib/service/__tests__/IssueReporter.test.js +25 -2
  105. package/lib/service/getApiClient.js +70 -5
  106. package/lib/simple/Auth.js +147 -80
  107. package/lib/simple/Configuration.js +147 -80
  108. package/lib/simple/Directory.js +70 -5
  109. package/lib/simple/Phone.js +147 -80
  110. package/lib/simple/Websocket.js +28 -2
  111. package/lib/simple/index.js +147 -80
  112. package/lib/simple/room/LocalParticipant.js +147 -80
  113. package/lib/simple/room/Participant.js +147 -80
  114. package/lib/simple/room/RemoteParticipant.js +147 -80
  115. package/lib/simple/room/Room.js +147 -80
  116. package/lib/simple/room/SipRoom.js +147 -80
  117. package/lib/simple/room/Stream.js +147 -80
  118. package/lib/simple/room/__tests__/RemoteParticipant.test.js +147 -80
  119. package/lib/simple/utils.js +147 -80
  120. package/lib/utils/__tests__/api-requester.test.js +25 -2
  121. package/lib/utils/api-requester.js +25 -2
  122. package/lib/web-rtc-client.js +111 -67
  123. package/lib/websocket-client.js +28 -2
  124. package/package.json +2 -2
  125. package/src/api/confd.js +5 -2
  126. package/src/domain/Call.js +3 -0
  127. package/src/domain/CallLog.js +4 -0
  128. package/src/domain/ChatMessage.js +4 -0
  129. package/src/domain/ChatRoom.js +3 -0
  130. package/src/domain/Contact.js +3 -0
  131. package/src/domain/Meeting.js +17 -1
  132. package/src/domain/Phone/CTIPhone.js +4 -0
  133. package/src/domain/Phone/Phone.js +2 -0
  134. package/src/domain/Phone/WebRTCPhone.js +25 -14
  135. package/src/domain/Recording.js +3 -0
  136. package/src/domain/Voicemail.js +3 -0
  137. package/src/lib/WazoSessionDescriptionHandler.js +1 -35
  138. package/src/service/IssueReporter.js +25 -2
  139. package/src/simple/Phone.js +5 -0
  140. package/src/types/WebSocketMessage.js +5 -1
  141. package/src/web-rtc-client.js +41 -24
  142. package/src/websocket-client.js +2 -0
@@ -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 => {
@@ -1526,6 +1549,9 @@ class Contact {
1526
1549
  }
1527
1550
 
1528
1551
  static parseMany(response ) {
1552
+ if (!response || !response.results) {
1553
+ return [];
1554
+ }
1529
1555
  return response.results.map(r => Contact.parse(r, response.column_types));
1530
1556
  }
1531
1557
 
@@ -2632,11 +2658,27 @@ class Meeting {
2632
2658
  });
2633
2659
  }
2634
2660
 
2661
+ static parseMany(items ) {
2662
+ if (!items) {
2663
+ return [];
2664
+ }
2665
+ return items.map(plain => Meeting.parse(plain));
2666
+ }
2667
+
2635
2668
  static newFrom(meeting ) {
2636
2669
  return newFrom(meeting, Meeting);
2637
2670
  }
2638
2671
 
2639
- constructor({ uuid, name, guestSipAuthorization, ownerUuids, port, uri, number, persistent } = {}) {
2672
+ constructor({
2673
+ uuid,
2674
+ name,
2675
+ guestSipAuthorization,
2676
+ ownerUuids,
2677
+ port,
2678
+ uri,
2679
+ number,
2680
+ persistent,
2681
+ } = {}) {
2640
2682
  this.guestSipAuthorization = guestSipAuthorization;
2641
2683
  this.uri = uri;
2642
2684
  this.name = name;
@@ -2722,8 +2764,11 @@ var confdMethods = (client , baseUrl ) => ({
2722
2764
  }
2723
2765
  },
2724
2766
 
2725
- createMyMeeting: (name ) =>
2726
- client.post(`${baseUrl}/users/me/meetings`, { name }).then(Meeting.parse),
2767
+ getMyMeetings: () =>
2768
+ client.get(`${baseUrl}/users/me/meetings`).then(response => Meeting.parseMany(response.items)),
2769
+
2770
+ createMyMeeting: (name , persistent ) =>
2771
+ client.post(`${baseUrl}/users/me/meetings`, { name, persistent }).then(Meeting.parse),
2727
2772
 
2728
2773
  deleteMyMeeting: (meetingUuid ) =>
2729
2774
  client.delete(`${baseUrl}/users/me/meetings/${meetingUuid}`, null),
@@ -2819,6 +2864,10 @@ class ChatMessage {
2819
2864
 
2820
2865
 
2821
2866
  static parseMany(plain ) {
2867
+ if (!plain || !plain.items) {
2868
+ return [];
2869
+ }
2870
+
2822
2871
  return plain.items.map(item => ChatMessage.parse(item));
2823
2872
  }
2824
2873
 
@@ -2928,6 +2977,9 @@ class Voicemail {
2928
2977
  }
2929
2978
 
2930
2979
  static parseMany(plain ) {
2980
+ if (!plain) {
2981
+ return [];
2982
+ }
2931
2983
  const plainUnread = plain.folders.filter(folder => folder.type === 'new')[0].messages;
2932
2984
  const plainRead = plain.folders.filter(folder => folder.type === 'old')[0].messages;
2933
2985
 
@@ -3037,6 +3089,9 @@ class Call {
3037
3089
 
3038
3090
 
3039
3091
  static parseMany(plain ) {
3092
+ if (!plain) {
3093
+ return [];
3094
+ }
3040
3095
  return plain.map((plainCall ) => Call.parse(plainCall));
3041
3096
  }
3042
3097
 
@@ -3235,6 +3290,9 @@ class Recording {
3235
3290
 
3236
3291
 
3237
3292
  static parseMany(recordings = []) {
3293
+ if (!recordings) {
3294
+ return [];
3295
+ }
3238
3296
  return recordings.map(item => Recording.parse(item));
3239
3297
  }
3240
3298
 
@@ -3336,6 +3394,10 @@ class CallLog {
3336
3394
  }
3337
3395
 
3338
3396
  static parseMany(plain ) {
3397
+ if (!plain || !plain.items) {
3398
+ return [];
3399
+ }
3400
+
3339
3401
  return plain.items.map(item => CallLog.parse(item));
3340
3402
  }
3341
3403
 
@@ -3908,6 +3970,9 @@ class ChatRoom {
3908
3970
 
3909
3971
 
3910
3972
  static parseMany(plain ) {
3973
+ if (!plain || !plain.items) {
3974
+ return [];
3975
+ }
3911
3976
  return plain.items.map(item => ChatRoom.parse(item));
3912
3977
  }
3913
3978
 
@@ -4903,6 +4968,7 @@ const AGENT_PAUSED = 'agent_paused';
4903
4968
  const AGENT_UNPAUSED = 'agent_unpaused';
4904
4969
  const CONFERENCE_ADHOC_PARTICIPANT_LEFT = 'conference_adhoc_participant_left';
4905
4970
  const CONFERENCE_ADHOC_DELETED = 'conference_adhoc_deleted';
4971
+ const MEETING_USER_PROGRESS = 'meeting_user_progress';
4906
4972
 
4907
4973
  const BLACKLIST_EVENTS = [
4908
4974
  CHAT_MESSAGE_SENT,
@@ -5253,6 +5319,7 @@ WebSocketClient.eventLists = [
5253
5319
  AGENT_UNPAUSED,
5254
5320
  CONFERENCE_ADHOC_PARTICIPANT_LEFT,
5255
5321
  CONFERENCE_ADHOC_DELETED,
5322
+ MEETING_USER_PROGRESS,
5256
5323
  ];
5257
5324
 
5258
5325
  var wazoWebsocket = {
@@ -5308,10 +5375,6 @@ const getSrflxOrRelay = (candidates ) =>
5308
5375
  candidates
5309
5376
  .filter(candidate => candidate && (candidate.type === 'srflx' || candidate.type === 'relay'));
5310
5377
 
5311
- const areCandidateValid = (candidates ) =>
5312
- getSrflxOrRelay(candidates)
5313
- .length > 0;
5314
-
5315
5378
  const getVideoDirection = (sdp ) => {
5316
5379
  const parsedSdp = sdpParser.parse(sdp);
5317
5380
  const videoMedia = parsedSdp.media.find(media => media.type === 'video');
@@ -5364,8 +5427,6 @@ const fixSdp = (sdp , candidates , forcePort = true)
5364
5427
  /* global RTCSessionDescriptionInit, navigator */
5365
5428
 
5366
5429
  const wazoLogger = IssueReporter$1 ? IssueReporter$1.loggerFor('webrtc-sdh') : console;
5367
- const MAX_WAIT_FOR_ICE_TRIES = 20;
5368
- const WAIT_FOR_ICE_TIMEOUT = 500;
5369
5430
 
5370
5431
  // Customized mediaStreamFactory allowing to send screensharing stream directory when upgrading
5371
5432
  const wazoMediaStreamFactory = (constraints ) => {
@@ -5555,38 +5616,6 @@ class WazoSessionDescriptionHandler extends SessionDescriptionHandler {
5555
5616
  this._peerConnection = undefined;
5556
5617
  }
5557
5618
 
5558
- async _waitForValidGatheredIce() {
5559
- let tries = 0;
5560
-
5561
- while (!areCandidateValid(this.gatheredCandidates) && tries < MAX_WAIT_FOR_ICE_TRIES) {
5562
- wazoLogger.trace('SessionDescriptionHandler._waitForValidGatheredIce, waiting for ice', {
5563
- tries,
5564
- max: MAX_WAIT_FOR_ICE_TRIES,
5565
- });
5566
-
5567
- tries++;
5568
-
5569
- // eslint-disable-next-line no-await-in-loop
5570
- await new Promise(resolve => setTimeout(resolve, WAIT_FOR_ICE_TIMEOUT));
5571
- }
5572
-
5573
- if (tries >= MAX_WAIT_FOR_ICE_TRIES) {
5574
- const errorMsg = 'No valid candidates found, can\'t answer the call';
5575
- const error = new Error(errorMsg);
5576
- wazoLogger.error(errorMsg, { tries, max: MAX_WAIT_FOR_ICE_TRIES });
5577
-
5578
- // Emit an error, because sip.js catches the exception and switch to status Terminated.
5579
- this.eventEmitter.emit('error', error);
5580
-
5581
- wazoLogger.error('No valid candidates found', { tries, candidates: JSON.stringify(this.gatheredCandidates) });
5582
- }
5583
-
5584
- // eslint-disable-next-line
5585
- wazoLogger.trace('Found valid candidates', { tries, candidates: JSON.stringify(this.gatheredCandidates) });
5586
-
5587
- return this.getLocalSessionDescription();
5588
- }
5589
-
5590
5619
  // Overridden to send `inactive` in conference
5591
5620
  updateDirection(options , isConference = false,
5592
5621
  audioOnly = false) {
@@ -6281,7 +6310,9 @@ class WebRTCClient extends Emitter {
6281
6310
  const inviteOptions = {
6282
6311
  requestDelegate: {
6283
6312
  onAccept: (response ) => {
6284
- session.sessionDescriptionHandler.peerConnection.sfu = conference;
6313
+ if (session.sessionDescriptionHandler.peerConnection) {
6314
+ session.sessionDescriptionHandler.peerConnection.sfu = conference;
6315
+ }
6285
6316
  this._onAccepted(session, response.session, true);
6286
6317
  },
6287
6318
  onReject: (response ) => {
@@ -7153,6 +7184,16 @@ class WebRTCClient extends Emitter {
7153
7184
  return this.hasRemoteVideo(sessionId) ? this.getRemoteStream(sessionId) : null;
7154
7185
  }
7155
7186
 
7187
+ // Useful in a react-native environment when remoteMediaStream is not updated
7188
+ getRemoteVideoStreamFromPc(sessionId ) {
7189
+ const pc = this.getPeerConnection(sessionId);
7190
+ if (!pc) {
7191
+ return null;
7192
+ }
7193
+
7194
+ return pc.getRemoteStreams().find(stream => !!stream.getVideoTracks().length);
7195
+ }
7196
+
7156
7197
  hasVideo(sessionId ) {
7157
7198
  return this.hasLocalVideo(sessionId) || this.hasRemoteVideo(sessionId);
7158
7199
  }
@@ -7663,6 +7704,7 @@ class WebRTCClient extends Emitter {
7663
7704
  session.sessionDescriptionHandler.remoteMediaStream.onaddtrack = onTrack;
7664
7705
 
7665
7706
  pc.oniceconnectionstatechange = () => {
7707
+ logger$1.info('on ice connection state changed', { state: pc.iceConnectionState });
7666
7708
  if (pc.iceConnectionState === 'disconnected') {
7667
7709
  this.eventEmitter.emit(ON_DISCONNECTED);
7668
7710
  }
@@ -7891,25 +7933,25 @@ class WebRTCClient extends Emitter {
7891
7933
 
7892
7934
  stats.forEach(report => {
7893
7935
  if (report.type === 'outbound-rtp' && report.kind === 'audio') {
7894
- audioBytesSent += report.bytesSent + report.headerBytesSent;
7936
+ audioBytesSent += Number(report.bytesSent) + Number(report.headerBytesSent);
7895
7937
  }
7896
7938
  if (report.type === 'remote-outbound-rtp' && report.kind === 'audio') {
7897
- audioBytesSent += report.bytesSent;
7939
+ audioBytesSent += Number(report.bytesSent);
7898
7940
  }
7899
7941
  if (report.type === 'outbound-rtp' && report.kind === 'video') {
7900
- videoBytesSent += report.bytesSent + report.headerBytesSent;
7942
+ videoBytesSent += Number(report.bytesSent) + Number(report.headerBytesSent);
7901
7943
  }
7902
7944
  if (report.type === 'inbound-rtp' && report.kind === 'audio') {
7903
- packetsLost += report.packetsLost;
7904
- networkStats.packetsReceived = report.packetsReceived;
7905
- audioBytesReceived += report.bytesReceived + report.headerBytesReceived;
7945
+ packetsLost += Number(report.packetsLost);
7946
+ networkStats.packetsReceived = Number(report.packetsReceived);
7947
+ audioBytesReceived += Number(report.bytesReceived) + Number(report.headerBytesReceived);
7906
7948
  }
7907
7949
  if (report.type === 'inbound-rtp' && report.kind === 'video') {
7908
- videoBytesReceived += report.bytesReceived + report.headerBytesReceived;
7950
+ videoBytesReceived += Number(report.bytesReceived) + Number(report.headerBytesReceived);
7909
7951
  }
7910
7952
  if (report.type === 'outbound-rtp' && report.kind === 'video') {
7911
7953
  if ('framesPerSecond' in report) {
7912
- networkStats.framesPerSecond = report.framesPerSecond;
7954
+ networkStats.framesPerSecond = Number(report.framesPerSecond);
7913
7955
  }
7914
7956
  if ('framerateMean' in report) {
7915
7957
  // framerateMean is only available in FF
@@ -7917,32 +7959,36 @@ class WebRTCClient extends Emitter {
7917
7959
  }
7918
7960
  }
7919
7961
  if (report.type === 'remote-inbound-rtp' && report.kind === 'audio') {
7920
- packetsLost += report.packetsLost;
7921
- networkStats.roundTripTime = report.roundTripTime;
7922
- networkStats.jitter = report.jitter;
7962
+ packetsLost += Number(report.packetsLost);
7963
+ networkStats.roundTripTime = Number(report.roundTripTime);
7964
+ networkStats.jitter = Number(report.jitter);
7923
7965
  }
7924
7966
  if (report.type === 'remote-inbound-rtp' && report.kind === 'video') {
7925
- packetsLost += report.packetsLost;
7967
+ packetsLost += Number(report.packetsLost);
7926
7968
  }
7927
7969
  if (report.type === 'transport') {
7928
- transportSent += report.bytesSent;
7929
- transportReceived += report.bytesReceived;
7970
+ transportSent += Number(report.bytesSent);
7971
+ transportReceived += Number(report.bytesReceived);
7930
7972
  }
7931
7973
  });
7932
7974
 
7933
7975
  networkStats.packetsLost = packetsLost;
7934
- networkStats.audioBytesSent = audioBytesSent;
7976
+ networkStats.totalAudioBytesSent = audioBytesSent;
7977
+ networkStats.audioBytesSent = audioBytesSent - lastAudioSent;
7978
+ networkStats.totalAudioBytesReceived = audioBytesReceived - lastAudioReceived;
7935
7979
  networkStats.audioBytesReceived = audioBytesReceived;
7936
- networkStats.videoBytesSent = videoBytesSent;
7937
- networkStats.videoBytesReceived = videoBytesReceived;
7980
+ networkStats.totalVideoBytesSent = videoBytesSent;
7981
+ networkStats.videoBytesSent = videoBytesSent - lastVideoSent;
7982
+ networkStats.totalVideoBytesReceived = videoBytesReceived;
7983
+ networkStats.videoBytesReceived = videoBytesReceived - lastVideoReceived;
7984
+ networkStats.totalTransportSent = transportSent - lastTransportSent;
7938
7985
  networkStats.transportSent = transportSent;
7939
- networkStats.transportReceived = transportReceived;
7940
-
7941
- const bandwidth = (networkStats.audioBytesSent - lastAudioSent) + (networkStats.videoBytesSent - lastVideoSent)
7942
- + (networkStats.audioBytesReceived - lastAudioReceived) + (networkStats.videoBytesReceived - lastVideoReceived)
7943
- + (networkStats.transportReceived - lastTransportReceived) + (networkStats.transportSent - lastTransportSent);
7986
+ networkStats.totalTransportReceived = transportReceived;
7987
+ networkStats.transportReceived = transportReceived - lastTransportReceived;
7944
7988
 
7945
- networkStats.bandwidth = bandwidth;
7989
+ networkStats.bandwidth = networkStats.audioBytesSent + networkStats.audioBytesReceived
7990
+ + networkStats.videoBytesSent + networkStats.videoBytesReceived + networkStats.transportReceived
7991
+ + networkStats.transportSent;
7946
7992
 
7947
7993
  this.eventEmitter.emit(ON_NETWORK_STATS, session, networkStats, this.sessionNetworkStats[sessionId]);
7948
7994
  this.sessionNetworkStats[sessionId].push(networkStats);
@@ -130,6 +130,7 @@ class IssueReporter {
130
130
 
131
131
 
132
132
 
133
+
133
134
 
134
135
  constructor() {
135
136
  addLevelsTo(this);
@@ -141,12 +142,17 @@ class IssueReporter {
141
142
  this.bufferTimeout = null;
142
143
  this._boundProcessBuffer = this._processBuffer.bind(this);
143
144
  this._boundParseLoggerBody = this._parseLoggerBody.bind(this);
145
+ this._callback = null;
144
146
  }
145
147
 
146
148
  init() {
147
149
  this._catchConsole();
148
150
  }
149
151
 
152
+ setCallback(cb ) {
153
+ this._callback = cb;
154
+ }
155
+
150
156
  configureRemoteClient(configuration = { tag: 'wazo-sdk', host: null, port: null, level: null, extra: {} }) {
151
157
  this.remoteClientConfiguration = configuration;
152
158
  }
@@ -182,6 +188,7 @@ class IssueReporter {
182
188
 
183
189
  // Handle category label
184
190
  let category = null;
191
+ let skipSendToRemote = false;
185
192
  let extra = {};
186
193
  if (args[0].indexOf(CATEGORY_PREFIX) === 0) {
187
194
  category = args[0].split('=')[1];
@@ -197,6 +204,7 @@ class IssueReporter {
197
204
  errorMessage: lastArg.message,
198
205
  errorStack: lastArg.stack,
199
206
  errorType: lastArg.constructor.name,
207
+ skipSendToRemote: lastArg.skipSendToRemote,
200
208
  };
201
209
  } else {
202
210
  extra = lastArg;
@@ -205,6 +213,11 @@ class IssueReporter {
205
213
  args.splice(1, 1);
206
214
  }
207
215
 
216
+ if (extra.skipSendToRemote) {
217
+ skipSendToRemote = true;
218
+ delete extra.skipSendToRemote;
219
+ }
220
+
208
221
  const date = moment().format('YYYY-MM-DD HH:mm:ss.SSS');
209
222
  const message = args.join(', ');
210
223
  let consoleMessage = message;
@@ -225,7 +238,13 @@ class IssueReporter {
225
238
  const oldMethod = this.oldConsoleMethods[consoleLevel] || this.oldConsoleMethods.log;
226
239
  oldMethod.apply(oldMethod, [date, consoleMessage]);
227
240
 
228
- this._sendToRemoteLogger(level, { date, message, category, ...extra });
241
+ if (this._callback) {
242
+ this._callback(level, consoleMessage);
243
+ }
244
+
245
+ if (!skipSendToRemote) {
246
+ this._sendToRemoteLogger(level, { date, message, category, ...extra });
247
+ }
229
248
  }
230
249
 
231
250
  logRequest(url , options , response , start ) {
@@ -370,7 +389,11 @@ class IssueReporter {
370
389
  },
371
390
  // $FlowFixMe
372
391
  body,
373
- }).catch(() => {
392
+ }).catch((e ) => {
393
+ // $FlowFixMe
394
+ e.skipSendToRemote = true;
395
+ this.log('error', this._makeCategory('grafana'), 'Sending log to grafana, error', e);
396
+
374
397
  setTimeout(() => {
375
398
  if (isArray) {
376
399
  payload = payload.map(message => {
@@ -1508,6 +1531,9 @@ class Contact {
1508
1531
  }
1509
1532
 
1510
1533
  static parseMany(response ) {
1534
+ if (!response || !response.results) {
1535
+ return [];
1536
+ }
1511
1537
  return response.results.map(r => Contact.parse(r, response.column_types));
1512
1538
  }
1513
1539
 
@@ -2614,11 +2640,27 @@ class Meeting {
2614
2640
  });
2615
2641
  }
2616
2642
 
2643
+ static parseMany(items ) {
2644
+ if (!items) {
2645
+ return [];
2646
+ }
2647
+ return items.map(plain => Meeting.parse(plain));
2648
+ }
2649
+
2617
2650
  static newFrom(meeting ) {
2618
2651
  return newFrom(meeting, Meeting);
2619
2652
  }
2620
2653
 
2621
- constructor({ uuid, name, guestSipAuthorization, ownerUuids, port, uri, number, persistent } = {}) {
2654
+ constructor({
2655
+ uuid,
2656
+ name,
2657
+ guestSipAuthorization,
2658
+ ownerUuids,
2659
+ port,
2660
+ uri,
2661
+ number,
2662
+ persistent,
2663
+ } = {}) {
2622
2664
  this.guestSipAuthorization = guestSipAuthorization;
2623
2665
  this.uri = uri;
2624
2666
  this.name = name;
@@ -2704,8 +2746,11 @@ var confdMethods = (client , baseUrl ) => ({
2704
2746
  }
2705
2747
  },
2706
2748
 
2707
- createMyMeeting: (name ) =>
2708
- 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),
2709
2754
 
2710
2755
  deleteMyMeeting: (meetingUuid ) =>
2711
2756
  client.delete(`${baseUrl}/users/me/meetings/${meetingUuid}`, null),
@@ -2801,6 +2846,10 @@ class ChatMessage {
2801
2846
 
2802
2847
 
2803
2848
  static parseMany(plain ) {
2849
+ if (!plain || !plain.items) {
2850
+ return [];
2851
+ }
2852
+
2804
2853
  return plain.items.map(item => ChatMessage.parse(item));
2805
2854
  }
2806
2855
 
@@ -2910,6 +2959,9 @@ class Voicemail {
2910
2959
  }
2911
2960
 
2912
2961
  static parseMany(plain ) {
2962
+ if (!plain) {
2963
+ return [];
2964
+ }
2913
2965
  const plainUnread = plain.folders.filter(folder => folder.type === 'new')[0].messages;
2914
2966
  const plainRead = plain.folders.filter(folder => folder.type === 'old')[0].messages;
2915
2967
 
@@ -3019,6 +3071,9 @@ class Call {
3019
3071
 
3020
3072
 
3021
3073
  static parseMany(plain ) {
3074
+ if (!plain) {
3075
+ return [];
3076
+ }
3022
3077
  return plain.map((plainCall ) => Call.parse(plainCall));
3023
3078
  }
3024
3079
 
@@ -3191,6 +3246,9 @@ class Recording {
3191
3246
 
3192
3247
 
3193
3248
  static parseMany(recordings = []) {
3249
+ if (!recordings) {
3250
+ return [];
3251
+ }
3194
3252
  return recordings.map(item => Recording.parse(item));
3195
3253
  }
3196
3254
 
@@ -3292,6 +3350,10 @@ class CallLog {
3292
3350
  }
3293
3351
 
3294
3352
  static parseMany(plain ) {
3353
+ if (!plain || !plain.items) {
3354
+ return [];
3355
+ }
3356
+
3295
3357
  return plain.items.map(item => CallLog.parse(item));
3296
3358
  }
3297
3359
 
@@ -3864,6 +3926,9 @@ class ChatRoom {
3864
3926
 
3865
3927
 
3866
3928
  static parseMany(plain ) {
3929
+ if (!plain || !plain.items) {
3930
+ return [];
3931
+ }
3867
3932
  return plain.items.map(item => ChatRoom.parse(item));
3868
3933
  }
3869
3934