@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
@@ -421,6 +421,7 @@ class IssueReporter {
421
421
 
422
422
 
423
423
 
424
+
424
425
 
425
426
  constructor() {
426
427
  addLevelsTo(this);
@@ -432,12 +433,17 @@ class IssueReporter {
432
433
  this.bufferTimeout = null;
433
434
  this._boundProcessBuffer = this._processBuffer.bind(this);
434
435
  this._boundParseLoggerBody = this._parseLoggerBody.bind(this);
436
+ this._callback = null;
435
437
  }
436
438
 
437
439
  init() {
438
440
  this._catchConsole();
439
441
  }
440
442
 
443
+ setCallback(cb ) {
444
+ this._callback = cb;
445
+ }
446
+
441
447
  configureRemoteClient(configuration = { tag: 'wazo-sdk', host: null, port: null, level: null, extra: {} }) {
442
448
  this.remoteClientConfiguration = configuration;
443
449
  }
@@ -473,6 +479,7 @@ class IssueReporter {
473
479
 
474
480
  // Handle category label
475
481
  let category = null;
482
+ let skipSendToRemote = false;
476
483
  let extra = {};
477
484
  if (args[0].indexOf(CATEGORY_PREFIX) === 0) {
478
485
  category = args[0].split('=')[1];
@@ -488,6 +495,7 @@ class IssueReporter {
488
495
  errorMessage: lastArg.message,
489
496
  errorStack: lastArg.stack,
490
497
  errorType: lastArg.constructor.name,
498
+ skipSendToRemote: lastArg.skipSendToRemote,
491
499
  };
492
500
  } else {
493
501
  extra = lastArg;
@@ -496,6 +504,11 @@ class IssueReporter {
496
504
  args.splice(1, 1);
497
505
  }
498
506
 
507
+ if (extra.skipSendToRemote) {
508
+ skipSendToRemote = true;
509
+ delete extra.skipSendToRemote;
510
+ }
511
+
499
512
  const date = moment__default['default']().format('YYYY-MM-DD HH:mm:ss.SSS');
500
513
  const message = args.join(', ');
501
514
  let consoleMessage = message;
@@ -516,7 +529,13 @@ class IssueReporter {
516
529
  const oldMethod = this.oldConsoleMethods[consoleLevel] || this.oldConsoleMethods.log;
517
530
  oldMethod.apply(oldMethod, [date, consoleMessage]);
518
531
 
519
- this._sendToRemoteLogger(level, { date, message, category, ...extra });
532
+ if (this._callback) {
533
+ this._callback(level, consoleMessage);
534
+ }
535
+
536
+ if (!skipSendToRemote) {
537
+ this._sendToRemoteLogger(level, { date, message, category, ...extra });
538
+ }
520
539
  }
521
540
 
522
541
  logRequest(url , options , response , start ) {
@@ -661,7 +680,11 @@ class IssueReporter {
661
680
  },
662
681
  // $FlowFixMe
663
682
  body,
664
- }).catch(() => {
683
+ }).catch((e ) => {
684
+ // $FlowFixMe
685
+ e.skipSendToRemote = true;
686
+ this.log('error', this._makeCategory('grafana'), 'Sending log to grafana, error', e);
687
+
665
688
  setTimeout(() => {
666
689
  if (isArray) {
667
690
  payload = payload.map(message => {
@@ -710,10 +733,6 @@ const getSrflxOrRelay = (candidates ) =>
710
733
  candidates
711
734
  .filter(candidate => candidate && (candidate.type === 'srflx' || candidate.type === 'relay'));
712
735
 
713
- const areCandidateValid = (candidates ) =>
714
- getSrflxOrRelay(candidates)
715
- .length > 0;
716
-
717
736
  const getVideoDirection = (sdp ) => {
718
737
  const parsedSdp = sdpParser__default['default'].parse(sdp);
719
738
  const videoMedia = parsedSdp.media.find(media => media.type === 'video');
@@ -766,8 +785,6 @@ const fixSdp = (sdp , candidates , forcePort = true)
766
785
  /* global RTCSessionDescriptionInit, navigator */
767
786
 
768
787
  const wazoLogger = IssueReporter$1 ? IssueReporter$1.loggerFor('webrtc-sdh') : console;
769
- const MAX_WAIT_FOR_ICE_TRIES = 20;
770
- const WAIT_FOR_ICE_TIMEOUT = 500;
771
788
 
772
789
  // Customized mediaStreamFactory allowing to send screensharing stream directory when upgrading
773
790
  const wazoMediaStreamFactory = (constraints ) => {
@@ -957,38 +974,6 @@ class WazoSessionDescriptionHandler extends sessionDescriptionHandler.SessionDes
957
974
  this._peerConnection = undefined;
958
975
  }
959
976
 
960
- async _waitForValidGatheredIce() {
961
- let tries = 0;
962
-
963
- while (!areCandidateValid(this.gatheredCandidates) && tries < MAX_WAIT_FOR_ICE_TRIES) {
964
- wazoLogger.trace('SessionDescriptionHandler._waitForValidGatheredIce, waiting for ice', {
965
- tries,
966
- max: MAX_WAIT_FOR_ICE_TRIES,
967
- });
968
-
969
- tries++;
970
-
971
- // eslint-disable-next-line no-await-in-loop
972
- await new Promise(resolve => setTimeout(resolve, WAIT_FOR_ICE_TIMEOUT));
973
- }
974
-
975
- if (tries >= MAX_WAIT_FOR_ICE_TRIES) {
976
- const errorMsg = 'No valid candidates found, can\'t answer the call';
977
- const error = new Error(errorMsg);
978
- wazoLogger.error(errorMsg, { tries, max: MAX_WAIT_FOR_ICE_TRIES });
979
-
980
- // Emit an error, because sip.js catches the exception and switch to status Terminated.
981
- this.eventEmitter.emit('error', error);
982
-
983
- wazoLogger.error('No valid candidates found', { tries, candidates: JSON.stringify(this.gatheredCandidates) });
984
- }
985
-
986
- // eslint-disable-next-line
987
- wazoLogger.trace('Found valid candidates', { tries, candidates: JSON.stringify(this.gatheredCandidates) });
988
-
989
- return this.getLocalSessionDescription();
990
- }
991
-
992
977
  // Overridden to send `inactive` in conference
993
978
  updateDirection(options , isConference = false,
994
979
  audioOnly = false) {
@@ -2098,6 +2083,9 @@ class Contact {
2098
2083
  }
2099
2084
 
2100
2085
  static parseMany(response ) {
2086
+ if (!response || !response.results) {
2087
+ return [];
2088
+ }
2101
2089
  return response.results.map(r => Contact.parse(r, response.column_types));
2102
2090
  }
2103
2091
 
@@ -3204,11 +3192,27 @@ class Meeting {
3204
3192
  });
3205
3193
  }
3206
3194
 
3195
+ static parseMany(items ) {
3196
+ if (!items) {
3197
+ return [];
3198
+ }
3199
+ return items.map(plain => Meeting.parse(plain));
3200
+ }
3201
+
3207
3202
  static newFrom(meeting ) {
3208
3203
  return newFrom(meeting, Meeting);
3209
3204
  }
3210
3205
 
3211
- constructor({ uuid, name, guestSipAuthorization, ownerUuids, port, uri, number, persistent } = {}) {
3206
+ constructor({
3207
+ uuid,
3208
+ name,
3209
+ guestSipAuthorization,
3210
+ ownerUuids,
3211
+ port,
3212
+ uri,
3213
+ number,
3214
+ persistent,
3215
+ } = {}) {
3212
3216
  this.guestSipAuthorization = guestSipAuthorization;
3213
3217
  this.uri = uri;
3214
3218
  this.name = name;
@@ -3294,8 +3298,11 @@ var confdMethods = (client , baseUrl ) => ({
3294
3298
  }
3295
3299
  },
3296
3300
 
3297
- createMyMeeting: (name ) =>
3298
- client.post(`${baseUrl}/users/me/meetings`, { name }).then(Meeting.parse),
3301
+ getMyMeetings: () =>
3302
+ client.get(`${baseUrl}/users/me/meetings`).then(response => Meeting.parseMany(response.items)),
3303
+
3304
+ createMyMeeting: (name , persistent ) =>
3305
+ client.post(`${baseUrl}/users/me/meetings`, { name, persistent }).then(Meeting.parse),
3299
3306
 
3300
3307
  deleteMyMeeting: (meetingUuid ) =>
3301
3308
  client.delete(`${baseUrl}/users/me/meetings/${meetingUuid}`, null),
@@ -3391,6 +3398,10 @@ class ChatMessage {
3391
3398
 
3392
3399
 
3393
3400
  static parseMany(plain ) {
3401
+ if (!plain || !plain.items) {
3402
+ return [];
3403
+ }
3404
+
3394
3405
  return plain.items.map(item => ChatMessage.parse(item));
3395
3406
  }
3396
3407
 
@@ -3500,6 +3511,9 @@ class Voicemail {
3500
3511
  }
3501
3512
 
3502
3513
  static parseMany(plain ) {
3514
+ if (!plain) {
3515
+ return [];
3516
+ }
3503
3517
  const plainUnread = plain.folders.filter(folder => folder.type === 'new')[0].messages;
3504
3518
  const plainRead = plain.folders.filter(folder => folder.type === 'old')[0].messages;
3505
3519
 
@@ -3609,6 +3623,9 @@ class Call {
3609
3623
 
3610
3624
 
3611
3625
  static parseMany(plain ) {
3626
+ if (!plain) {
3627
+ return [];
3628
+ }
3612
3629
  return plain.map((plainCall ) => Call.parse(plainCall));
3613
3630
  }
3614
3631
 
@@ -3781,6 +3798,9 @@ class Recording {
3781
3798
 
3782
3799
 
3783
3800
  static parseMany(recordings = []) {
3801
+ if (!recordings) {
3802
+ return [];
3803
+ }
3784
3804
  return recordings.map(item => Recording.parse(item));
3785
3805
  }
3786
3806
 
@@ -3882,6 +3902,10 @@ class CallLog {
3882
3902
  }
3883
3903
 
3884
3904
  static parseMany(plain ) {
3905
+ if (!plain || !plain.items) {
3906
+ return [];
3907
+ }
3908
+
3885
3909
  return plain.items.map(item => CallLog.parse(item));
3886
3910
  }
3887
3911
 
@@ -4454,6 +4478,9 @@ class ChatRoom {
4454
4478
 
4455
4479
 
4456
4480
  static parseMany(plain ) {
4481
+ if (!plain || !plain.items) {
4482
+ return [];
4483
+ }
4457
4484
  return plain.items.map(item => ChatRoom.parse(item));
4458
4485
  }
4459
4486
 
@@ -5707,7 +5734,9 @@ class WebRTCClient extends Emitter {
5707
5734
  const inviteOptions = {
5708
5735
  requestDelegate: {
5709
5736
  onAccept: (response ) => {
5710
- session.sessionDescriptionHandler.peerConnection.sfu = conference;
5737
+ if (session.sessionDescriptionHandler.peerConnection) {
5738
+ session.sessionDescriptionHandler.peerConnection.sfu = conference;
5739
+ }
5711
5740
  this._onAccepted(session, response.session, true);
5712
5741
  },
5713
5742
  onReject: (response ) => {
@@ -6579,6 +6608,16 @@ class WebRTCClient extends Emitter {
6579
6608
  return this.hasRemoteVideo(sessionId) ? this.getRemoteStream(sessionId) : null;
6580
6609
  }
6581
6610
 
6611
+ // Useful in a react-native environment when remoteMediaStream is not updated
6612
+ getRemoteVideoStreamFromPc(sessionId ) {
6613
+ const pc = this.getPeerConnection(sessionId);
6614
+ if (!pc) {
6615
+ return null;
6616
+ }
6617
+
6618
+ return pc.getRemoteStreams().find(stream => !!stream.getVideoTracks().length);
6619
+ }
6620
+
6582
6621
  hasVideo(sessionId ) {
6583
6622
  return this.hasLocalVideo(sessionId) || this.hasRemoteVideo(sessionId);
6584
6623
  }
@@ -7089,6 +7128,7 @@ class WebRTCClient extends Emitter {
7089
7128
  session.sessionDescriptionHandler.remoteMediaStream.onaddtrack = onTrack;
7090
7129
 
7091
7130
  pc.oniceconnectionstatechange = () => {
7131
+ logger.info('on ice connection state changed', { state: pc.iceConnectionState });
7092
7132
  if (pc.iceConnectionState === 'disconnected') {
7093
7133
  this.eventEmitter.emit(ON_DISCONNECTED);
7094
7134
  }
@@ -7317,25 +7357,25 @@ class WebRTCClient extends Emitter {
7317
7357
 
7318
7358
  stats.forEach(report => {
7319
7359
  if (report.type === 'outbound-rtp' && report.kind === 'audio') {
7320
- audioBytesSent += report.bytesSent + report.headerBytesSent;
7360
+ audioBytesSent += Number(report.bytesSent) + Number(report.headerBytesSent);
7321
7361
  }
7322
7362
  if (report.type === 'remote-outbound-rtp' && report.kind === 'audio') {
7323
- audioBytesSent += report.bytesSent;
7363
+ audioBytesSent += Number(report.bytesSent);
7324
7364
  }
7325
7365
  if (report.type === 'outbound-rtp' && report.kind === 'video') {
7326
- videoBytesSent += report.bytesSent + report.headerBytesSent;
7366
+ videoBytesSent += Number(report.bytesSent) + Number(report.headerBytesSent);
7327
7367
  }
7328
7368
  if (report.type === 'inbound-rtp' && report.kind === 'audio') {
7329
- packetsLost += report.packetsLost;
7330
- networkStats.packetsReceived = report.packetsReceived;
7331
- audioBytesReceived += report.bytesReceived + report.headerBytesReceived;
7369
+ packetsLost += Number(report.packetsLost);
7370
+ networkStats.packetsReceived = Number(report.packetsReceived);
7371
+ audioBytesReceived += Number(report.bytesReceived) + Number(report.headerBytesReceived);
7332
7372
  }
7333
7373
  if (report.type === 'inbound-rtp' && report.kind === 'video') {
7334
- videoBytesReceived += report.bytesReceived + report.headerBytesReceived;
7374
+ videoBytesReceived += Number(report.bytesReceived) + Number(report.headerBytesReceived);
7335
7375
  }
7336
7376
  if (report.type === 'outbound-rtp' && report.kind === 'video') {
7337
7377
  if ('framesPerSecond' in report) {
7338
- networkStats.framesPerSecond = report.framesPerSecond;
7378
+ networkStats.framesPerSecond = Number(report.framesPerSecond);
7339
7379
  }
7340
7380
  if ('framerateMean' in report) {
7341
7381
  // framerateMean is only available in FF
@@ -7343,32 +7383,36 @@ class WebRTCClient extends Emitter {
7343
7383
  }
7344
7384
  }
7345
7385
  if (report.type === 'remote-inbound-rtp' && report.kind === 'audio') {
7346
- packetsLost += report.packetsLost;
7347
- networkStats.roundTripTime = report.roundTripTime;
7348
- networkStats.jitter = report.jitter;
7386
+ packetsLost += Number(report.packetsLost);
7387
+ networkStats.roundTripTime = Number(report.roundTripTime);
7388
+ networkStats.jitter = Number(report.jitter);
7349
7389
  }
7350
7390
  if (report.type === 'remote-inbound-rtp' && report.kind === 'video') {
7351
- packetsLost += report.packetsLost;
7391
+ packetsLost += Number(report.packetsLost);
7352
7392
  }
7353
7393
  if (report.type === 'transport') {
7354
- transportSent += report.bytesSent;
7355
- transportReceived += report.bytesReceived;
7394
+ transportSent += Number(report.bytesSent);
7395
+ transportReceived += Number(report.bytesReceived);
7356
7396
  }
7357
7397
  });
7358
7398
 
7359
7399
  networkStats.packetsLost = packetsLost;
7360
- networkStats.audioBytesSent = audioBytesSent;
7400
+ networkStats.totalAudioBytesSent = audioBytesSent;
7401
+ networkStats.audioBytesSent = audioBytesSent - lastAudioSent;
7402
+ networkStats.totalAudioBytesReceived = audioBytesReceived - lastAudioReceived;
7361
7403
  networkStats.audioBytesReceived = audioBytesReceived;
7362
- networkStats.videoBytesSent = videoBytesSent;
7363
- networkStats.videoBytesReceived = videoBytesReceived;
7404
+ networkStats.totalVideoBytesSent = videoBytesSent;
7405
+ networkStats.videoBytesSent = videoBytesSent - lastVideoSent;
7406
+ networkStats.totalVideoBytesReceived = videoBytesReceived;
7407
+ networkStats.videoBytesReceived = videoBytesReceived - lastVideoReceived;
7408
+ networkStats.totalTransportSent = transportSent - lastTransportSent;
7364
7409
  networkStats.transportSent = transportSent;
7365
- networkStats.transportReceived = transportReceived;
7366
-
7367
- const bandwidth = (networkStats.audioBytesSent - lastAudioSent) + (networkStats.videoBytesSent - lastVideoSent)
7368
- + (networkStats.audioBytesReceived - lastAudioReceived) + (networkStats.videoBytesReceived - lastVideoReceived)
7369
- + (networkStats.transportReceived - lastTransportReceived) + (networkStats.transportSent - lastTransportSent);
7410
+ networkStats.totalTransportReceived = transportReceived;
7411
+ networkStats.transportReceived = transportReceived - lastTransportReceived;
7370
7412
 
7371
- networkStats.bandwidth = bandwidth;
7413
+ networkStats.bandwidth = networkStats.audioBytesSent + networkStats.audioBytesReceived
7414
+ + networkStats.videoBytesSent + networkStats.videoBytesReceived + networkStats.transportReceived
7415
+ + networkStats.transportSent;
7372
7416
 
7373
7417
  this.eventEmitter.emit(ON_NETWORK_STATS, session, networkStats, this.sessionNetworkStats[sessionId]);
7374
7418
  this.sessionNetworkStats[sessionId].push(networkStats);
@@ -82,6 +82,9 @@ class Call {
82
82
 
83
83
 
84
84
  static parseMany(plain ) {
85
+ if (!plain) {
86
+ return [];
87
+ }
85
88
  return plain.map((plainCall ) => Call.parse(plainCall));
86
89
  }
87
90
 
@@ -353,6 +356,7 @@ class IssueReporter {
353
356
 
354
357
 
355
358
 
359
+
356
360
 
357
361
  constructor() {
358
362
  addLevelsTo(this);
@@ -364,12 +368,17 @@ class IssueReporter {
364
368
  this.bufferTimeout = null;
365
369
  this._boundProcessBuffer = this._processBuffer.bind(this);
366
370
  this._boundParseLoggerBody = this._parseLoggerBody.bind(this);
371
+ this._callback = null;
367
372
  }
368
373
 
369
374
  init() {
370
375
  this._catchConsole();
371
376
  }
372
377
 
378
+ setCallback(cb ) {
379
+ this._callback = cb;
380
+ }
381
+
373
382
  configureRemoteClient(configuration = { tag: 'wazo-sdk', host: null, port: null, level: null, extra: {} }) {
374
383
  this.remoteClientConfiguration = configuration;
375
384
  }
@@ -405,6 +414,7 @@ class IssueReporter {
405
414
 
406
415
  // Handle category label
407
416
  let category = null;
417
+ let skipSendToRemote = false;
408
418
  let extra = {};
409
419
  if (args[0].indexOf(CATEGORY_PREFIX) === 0) {
410
420
  category = args[0].split('=')[1];
@@ -420,6 +430,7 @@ class IssueReporter {
420
430
  errorMessage: lastArg.message,
421
431
  errorStack: lastArg.stack,
422
432
  errorType: lastArg.constructor.name,
433
+ skipSendToRemote: lastArg.skipSendToRemote,
423
434
  };
424
435
  } else {
425
436
  extra = lastArg;
@@ -428,6 +439,11 @@ class IssueReporter {
428
439
  args.splice(1, 1);
429
440
  }
430
441
 
442
+ if (extra.skipSendToRemote) {
443
+ skipSendToRemote = true;
444
+ delete extra.skipSendToRemote;
445
+ }
446
+
431
447
  const date = moment__default['default']().format('YYYY-MM-DD HH:mm:ss.SSS');
432
448
  const message = args.join(', ');
433
449
  let consoleMessage = message;
@@ -448,7 +464,13 @@ class IssueReporter {
448
464
  const oldMethod = this.oldConsoleMethods[consoleLevel] || this.oldConsoleMethods.log;
449
465
  oldMethod.apply(oldMethod, [date, consoleMessage]);
450
466
 
451
- this._sendToRemoteLogger(level, { date, message, category, ...extra });
467
+ if (this._callback) {
468
+ this._callback(level, consoleMessage);
469
+ }
470
+
471
+ if (!skipSendToRemote) {
472
+ this._sendToRemoteLogger(level, { date, message, category, ...extra });
473
+ }
452
474
  }
453
475
 
454
476
  logRequest(url , options , response , start ) {
@@ -593,7 +615,11 @@ class IssueReporter {
593
615
  },
594
616
  // $FlowFixMe
595
617
  body,
596
- }).catch(() => {
618
+ }).catch((e ) => {
619
+ // $FlowFixMe
620
+ e.skipSendToRemote = true;
621
+ this.log('error', this._makeCategory('grafana'), 'Sending log to grafana, error', e);
622
+
597
623
  setTimeout(() => {
598
624
  if (isArray) {
599
625
  payload = payload.map(message => {
@@ -1720,6 +1746,9 @@ class Contact {
1720
1746
  }
1721
1747
 
1722
1748
  static parseMany(response ) {
1749
+ if (!response || !response.results) {
1750
+ return [];
1751
+ }
1723
1752
  return response.results.map(r => Contact.parse(r, response.column_types));
1724
1753
  }
1725
1754
 
@@ -2826,11 +2855,27 @@ class Meeting {
2826
2855
  });
2827
2856
  }
2828
2857
 
2858
+ static parseMany(items ) {
2859
+ if (!items) {
2860
+ return [];
2861
+ }
2862
+ return items.map(plain => Meeting.parse(plain));
2863
+ }
2864
+
2829
2865
  static newFrom(meeting ) {
2830
2866
  return newFrom(meeting, Meeting);
2831
2867
  }
2832
2868
 
2833
- constructor({ uuid, name, guestSipAuthorization, ownerUuids, port, uri, number, persistent } = {}) {
2869
+ constructor({
2870
+ uuid,
2871
+ name,
2872
+ guestSipAuthorization,
2873
+ ownerUuids,
2874
+ port,
2875
+ uri,
2876
+ number,
2877
+ persistent,
2878
+ } = {}) {
2834
2879
  this.guestSipAuthorization = guestSipAuthorization;
2835
2880
  this.uri = uri;
2836
2881
  this.name = name;
@@ -2916,8 +2961,11 @@ var confdMethods = (client , baseUrl ) => ({
2916
2961
  }
2917
2962
  },
2918
2963
 
2919
- createMyMeeting: (name ) =>
2920
- client.post(`${baseUrl}/users/me/meetings`, { name }).then(Meeting.parse),
2964
+ getMyMeetings: () =>
2965
+ client.get(`${baseUrl}/users/me/meetings`).then(response => Meeting.parseMany(response.items)),
2966
+
2967
+ createMyMeeting: (name , persistent ) =>
2968
+ client.post(`${baseUrl}/users/me/meetings`, { name, persistent }).then(Meeting.parse),
2921
2969
 
2922
2970
  deleteMyMeeting: (meetingUuid ) =>
2923
2971
  client.delete(`${baseUrl}/users/me/meetings/${meetingUuid}`, null),
@@ -3013,6 +3061,10 @@ class ChatMessage {
3013
3061
 
3014
3062
 
3015
3063
  static parseMany(plain ) {
3064
+ if (!plain || !plain.items) {
3065
+ return [];
3066
+ }
3067
+
3016
3068
  return plain.items.map(item => ChatMessage.parse(item));
3017
3069
  }
3018
3070
 
@@ -3122,6 +3174,9 @@ class Voicemail {
3122
3174
  }
3123
3175
 
3124
3176
  static parseMany(plain ) {
3177
+ if (!plain) {
3178
+ return [];
3179
+ }
3125
3180
  const plainUnread = plain.folders.filter(folder => folder.type === 'new')[0].messages;
3126
3181
  const plainRead = plain.folders.filter(folder => folder.type === 'old')[0].messages;
3127
3182
 
@@ -3197,6 +3252,9 @@ class Recording {
3197
3252
 
3198
3253
 
3199
3254
  static parseMany(recordings = []) {
3255
+ if (!recordings) {
3256
+ return [];
3257
+ }
3200
3258
  return recordings.map(item => Recording.parse(item));
3201
3259
  }
3202
3260
 
@@ -3298,6 +3356,10 @@ class CallLog {
3298
3356
  }
3299
3357
 
3300
3358
  static parseMany(plain ) {
3359
+ if (!plain || !plain.items) {
3360
+ return [];
3361
+ }
3362
+
3301
3363
  return plain.items.map(item => CallLog.parse(item));
3302
3364
  }
3303
3365
 
@@ -3855,6 +3917,9 @@ class ChatRoom {
3855
3917
 
3856
3918
 
3857
3919
  static parseMany(plain ) {
3920
+ if (!plain || !plain.items) {
3921
+ return [];
3922
+ }
3858
3923
  return plain.items.map(item => ChatRoom.parse(item));
3859
3924
  }
3860
3925
 
@@ -77,6 +77,9 @@ class Call {
77
77
 
78
78
 
79
79
  static parseMany(plain ) {
80
+ if (!plain) {
81
+ return [];
82
+ }
80
83
  return plain.map((plainCall ) => Call.parse(plainCall));
81
84
  }
82
85
 
@@ -60,6 +60,9 @@ class Recording {
60
60
 
61
61
 
62
62
  static parseMany(recordings = []) {
63
+ if (!recordings) {
64
+ return [];
65
+ }
63
66
  return recordings.map(item => Recording.parse(item));
64
67
  }
65
68
 
@@ -161,6 +164,10 @@ class CallLog {
161
164
  }
162
165
 
163
166
  static parseMany(plain ) {
167
+ if (!plain || !plain.items) {
168
+ return [];
169
+ }
170
+
164
171
  return plain.items.map(item => CallLog.parse(item));
165
172
  }
166
173
 
@@ -58,6 +58,10 @@ class ChatMessage {
58
58
 
59
59
 
60
60
  static parseMany(plain ) {
61
+ if (!plain || !plain.items) {
62
+ return [];
63
+ }
64
+
61
65
  return plain.items.map(item => ChatMessage.parse(item));
62
66
  }
63
67
 
@@ -33,6 +33,9 @@ class ChatRoom {
33
33
 
34
34
 
35
35
  static parseMany(plain ) {
36
+ if (!plain || !plain.items) {
37
+ return [];
38
+ }
36
39
  return plain.items.map(item => ChatRoom.parse(item));
37
40
  }
38
41
 
@@ -329,6 +329,9 @@ class Contact {
329
329
  }
330
330
 
331
331
  static parseMany(response ) {
332
+ if (!response || !response.results) {
333
+ return [];
334
+ }
332
335
  return response.results.map(r => Contact.parse(r, response.column_types));
333
336
  }
334
337