@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
@@ -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 => {
@@ -701,10 +724,6 @@ const getSrflxOrRelay = (candidates ) =>
701
724
  candidates
702
725
  .filter(candidate => candidate && (candidate.type === 'srflx' || candidate.type === 'relay'));
703
726
 
704
- const areCandidateValid = (candidates ) =>
705
- getSrflxOrRelay(candidates)
706
- .length > 0;
707
-
708
727
  const getVideoDirection = (sdp ) => {
709
728
  const parsedSdp = sdpParser.parse(sdp);
710
729
  const videoMedia = parsedSdp.media.find(media => media.type === 'video');
@@ -757,8 +776,6 @@ const fixSdp = (sdp , candidates , forcePort = true)
757
776
  /* global RTCSessionDescriptionInit, navigator */
758
777
 
759
778
  const wazoLogger = IssueReporter$1 ? IssueReporter$1.loggerFor('webrtc-sdh') : console;
760
- const MAX_WAIT_FOR_ICE_TRIES = 20;
761
- const WAIT_FOR_ICE_TIMEOUT = 500;
762
779
 
763
780
  // Customized mediaStreamFactory allowing to send screensharing stream directory when upgrading
764
781
  const wazoMediaStreamFactory = (constraints ) => {
@@ -948,38 +965,6 @@ class WazoSessionDescriptionHandler extends SessionDescriptionHandler {
948
965
  this._peerConnection = undefined;
949
966
  }
950
967
 
951
- async _waitForValidGatheredIce() {
952
- let tries = 0;
953
-
954
- while (!areCandidateValid(this.gatheredCandidates) && tries < MAX_WAIT_FOR_ICE_TRIES) {
955
- wazoLogger.trace('SessionDescriptionHandler._waitForValidGatheredIce, waiting for ice', {
956
- tries,
957
- max: MAX_WAIT_FOR_ICE_TRIES,
958
- });
959
-
960
- tries++;
961
-
962
- // eslint-disable-next-line no-await-in-loop
963
- await new Promise(resolve => setTimeout(resolve, WAIT_FOR_ICE_TIMEOUT));
964
- }
965
-
966
- if (tries >= MAX_WAIT_FOR_ICE_TRIES) {
967
- const errorMsg = 'No valid candidates found, can\'t answer the call';
968
- const error = new Error(errorMsg);
969
- wazoLogger.error(errorMsg, { tries, max: MAX_WAIT_FOR_ICE_TRIES });
970
-
971
- // Emit an error, because sip.js catches the exception and switch to status Terminated.
972
- this.eventEmitter.emit('error', error);
973
-
974
- wazoLogger.error('No valid candidates found', { tries, candidates: JSON.stringify(this.gatheredCandidates) });
975
- }
976
-
977
- // eslint-disable-next-line
978
- wazoLogger.trace('Found valid candidates', { tries, candidates: JSON.stringify(this.gatheredCandidates) });
979
-
980
- return this.getLocalSessionDescription();
981
- }
982
-
983
968
  // Overridden to send `inactive` in conference
984
969
  updateDirection(options , isConference = false,
985
970
  audioOnly = false) {
@@ -2089,6 +2074,9 @@ class Contact {
2089
2074
  }
2090
2075
 
2091
2076
  static parseMany(response ) {
2077
+ if (!response || !response.results) {
2078
+ return [];
2079
+ }
2092
2080
  return response.results.map(r => Contact.parse(r, response.column_types));
2093
2081
  }
2094
2082
 
@@ -3195,11 +3183,27 @@ class Meeting {
3195
3183
  });
3196
3184
  }
3197
3185
 
3186
+ static parseMany(items ) {
3187
+ if (!items) {
3188
+ return [];
3189
+ }
3190
+ return items.map(plain => Meeting.parse(plain));
3191
+ }
3192
+
3198
3193
  static newFrom(meeting ) {
3199
3194
  return newFrom(meeting, Meeting);
3200
3195
  }
3201
3196
 
3202
- constructor({ uuid, name, guestSipAuthorization, ownerUuids, port, uri, number, persistent } = {}) {
3197
+ constructor({
3198
+ uuid,
3199
+ name,
3200
+ guestSipAuthorization,
3201
+ ownerUuids,
3202
+ port,
3203
+ uri,
3204
+ number,
3205
+ persistent,
3206
+ } = {}) {
3203
3207
  this.guestSipAuthorization = guestSipAuthorization;
3204
3208
  this.uri = uri;
3205
3209
  this.name = name;
@@ -3285,8 +3289,11 @@ var confdMethods = (client , baseUrl ) => ({
3285
3289
  }
3286
3290
  },
3287
3291
 
3288
- createMyMeeting: (name ) =>
3289
- client.post(`${baseUrl}/users/me/meetings`, { name }).then(Meeting.parse),
3292
+ getMyMeetings: () =>
3293
+ client.get(`${baseUrl}/users/me/meetings`).then(response => Meeting.parseMany(response.items)),
3294
+
3295
+ createMyMeeting: (name , persistent ) =>
3296
+ client.post(`${baseUrl}/users/me/meetings`, { name, persistent }).then(Meeting.parse),
3290
3297
 
3291
3298
  deleteMyMeeting: (meetingUuid ) =>
3292
3299
  client.delete(`${baseUrl}/users/me/meetings/${meetingUuid}`, null),
@@ -3382,6 +3389,10 @@ class ChatMessage {
3382
3389
 
3383
3390
 
3384
3391
  static parseMany(plain ) {
3392
+ if (!plain || !plain.items) {
3393
+ return [];
3394
+ }
3395
+
3385
3396
  return plain.items.map(item => ChatMessage.parse(item));
3386
3397
  }
3387
3398
 
@@ -3491,6 +3502,9 @@ class Voicemail {
3491
3502
  }
3492
3503
 
3493
3504
  static parseMany(plain ) {
3505
+ if (!plain) {
3506
+ return [];
3507
+ }
3494
3508
  const plainUnread = plain.folders.filter(folder => folder.type === 'new')[0].messages;
3495
3509
  const plainRead = plain.folders.filter(folder => folder.type === 'old')[0].messages;
3496
3510
 
@@ -3600,6 +3614,9 @@ class Call {
3600
3614
 
3601
3615
 
3602
3616
  static parseMany(plain ) {
3617
+ if (!plain) {
3618
+ return [];
3619
+ }
3603
3620
  return plain.map((plainCall ) => Call.parse(plainCall));
3604
3621
  }
3605
3622
 
@@ -3772,6 +3789,9 @@ class Recording {
3772
3789
 
3773
3790
 
3774
3791
  static parseMany(recordings = []) {
3792
+ if (!recordings) {
3793
+ return [];
3794
+ }
3775
3795
  return recordings.map(item => Recording.parse(item));
3776
3796
  }
3777
3797
 
@@ -3873,6 +3893,10 @@ class CallLog {
3873
3893
  }
3874
3894
 
3875
3895
  static parseMany(plain ) {
3896
+ if (!plain || !plain.items) {
3897
+ return [];
3898
+ }
3899
+
3876
3900
  return plain.items.map(item => CallLog.parse(item));
3877
3901
  }
3878
3902
 
@@ -4445,6 +4469,9 @@ class ChatRoom {
4445
4469
 
4446
4470
 
4447
4471
  static parseMany(plain ) {
4472
+ if (!plain || !plain.items) {
4473
+ return [];
4474
+ }
4448
4475
  return plain.items.map(item => ChatRoom.parse(item));
4449
4476
  }
4450
4477
 
@@ -5701,7 +5728,9 @@ class WebRTCClient extends Emitter {
5701
5728
  const inviteOptions = {
5702
5729
  requestDelegate: {
5703
5730
  onAccept: (response ) => {
5704
- session.sessionDescriptionHandler.peerConnection.sfu = conference;
5731
+ if (session.sessionDescriptionHandler.peerConnection) {
5732
+ session.sessionDescriptionHandler.peerConnection.sfu = conference;
5733
+ }
5705
5734
  this._onAccepted(session, response.session, true);
5706
5735
  },
5707
5736
  onReject: (response ) => {
@@ -6573,6 +6602,16 @@ class WebRTCClient extends Emitter {
6573
6602
  return this.hasRemoteVideo(sessionId) ? this.getRemoteStream(sessionId) : null;
6574
6603
  }
6575
6604
 
6605
+ // Useful in a react-native environment when remoteMediaStream is not updated
6606
+ getRemoteVideoStreamFromPc(sessionId ) {
6607
+ const pc = this.getPeerConnection(sessionId);
6608
+ if (!pc) {
6609
+ return null;
6610
+ }
6611
+
6612
+ return pc.getRemoteStreams().find(stream => !!stream.getVideoTracks().length);
6613
+ }
6614
+
6576
6615
  hasVideo(sessionId ) {
6577
6616
  return this.hasLocalVideo(sessionId) || this.hasRemoteVideo(sessionId);
6578
6617
  }
@@ -7083,6 +7122,7 @@ class WebRTCClient extends Emitter {
7083
7122
  session.sessionDescriptionHandler.remoteMediaStream.onaddtrack = onTrack;
7084
7123
 
7085
7124
  pc.oniceconnectionstatechange = () => {
7125
+ logger.info('on ice connection state changed', { state: pc.iceConnectionState });
7086
7126
  if (pc.iceConnectionState === 'disconnected') {
7087
7127
  this.eventEmitter.emit(ON_DISCONNECTED);
7088
7128
  }
@@ -7311,25 +7351,25 @@ class WebRTCClient extends Emitter {
7311
7351
 
7312
7352
  stats.forEach(report => {
7313
7353
  if (report.type === 'outbound-rtp' && report.kind === 'audio') {
7314
- audioBytesSent += report.bytesSent + report.headerBytesSent;
7354
+ audioBytesSent += Number(report.bytesSent) + Number(report.headerBytesSent);
7315
7355
  }
7316
7356
  if (report.type === 'remote-outbound-rtp' && report.kind === 'audio') {
7317
- audioBytesSent += report.bytesSent;
7357
+ audioBytesSent += Number(report.bytesSent);
7318
7358
  }
7319
7359
  if (report.type === 'outbound-rtp' && report.kind === 'video') {
7320
- videoBytesSent += report.bytesSent + report.headerBytesSent;
7360
+ videoBytesSent += Number(report.bytesSent) + Number(report.headerBytesSent);
7321
7361
  }
7322
7362
  if (report.type === 'inbound-rtp' && report.kind === 'audio') {
7323
- packetsLost += report.packetsLost;
7324
- networkStats.packetsReceived = report.packetsReceived;
7325
- audioBytesReceived += report.bytesReceived + report.headerBytesReceived;
7363
+ packetsLost += Number(report.packetsLost);
7364
+ networkStats.packetsReceived = Number(report.packetsReceived);
7365
+ audioBytesReceived += Number(report.bytesReceived) + Number(report.headerBytesReceived);
7326
7366
  }
7327
7367
  if (report.type === 'inbound-rtp' && report.kind === 'video') {
7328
- videoBytesReceived += report.bytesReceived + report.headerBytesReceived;
7368
+ videoBytesReceived += Number(report.bytesReceived) + Number(report.headerBytesReceived);
7329
7369
  }
7330
7370
  if (report.type === 'outbound-rtp' && report.kind === 'video') {
7331
7371
  if ('framesPerSecond' in report) {
7332
- networkStats.framesPerSecond = report.framesPerSecond;
7372
+ networkStats.framesPerSecond = Number(report.framesPerSecond);
7333
7373
  }
7334
7374
  if ('framerateMean' in report) {
7335
7375
  // framerateMean is only available in FF
@@ -7337,32 +7377,36 @@ class WebRTCClient extends Emitter {
7337
7377
  }
7338
7378
  }
7339
7379
  if (report.type === 'remote-inbound-rtp' && report.kind === 'audio') {
7340
- packetsLost += report.packetsLost;
7341
- networkStats.roundTripTime = report.roundTripTime;
7342
- networkStats.jitter = report.jitter;
7380
+ packetsLost += Number(report.packetsLost);
7381
+ networkStats.roundTripTime = Number(report.roundTripTime);
7382
+ networkStats.jitter = Number(report.jitter);
7343
7383
  }
7344
7384
  if (report.type === 'remote-inbound-rtp' && report.kind === 'video') {
7345
- packetsLost += report.packetsLost;
7385
+ packetsLost += Number(report.packetsLost);
7346
7386
  }
7347
7387
  if (report.type === 'transport') {
7348
- transportSent += report.bytesSent;
7349
- transportReceived += report.bytesReceived;
7388
+ transportSent += Number(report.bytesSent);
7389
+ transportReceived += Number(report.bytesReceived);
7350
7390
  }
7351
7391
  });
7352
7392
 
7353
7393
  networkStats.packetsLost = packetsLost;
7354
- networkStats.audioBytesSent = audioBytesSent;
7394
+ networkStats.totalAudioBytesSent = audioBytesSent;
7395
+ networkStats.audioBytesSent = audioBytesSent - lastAudioSent;
7396
+ networkStats.totalAudioBytesReceived = audioBytesReceived - lastAudioReceived;
7355
7397
  networkStats.audioBytesReceived = audioBytesReceived;
7356
- networkStats.videoBytesSent = videoBytesSent;
7357
- networkStats.videoBytesReceived = videoBytesReceived;
7398
+ networkStats.totalVideoBytesSent = videoBytesSent;
7399
+ networkStats.videoBytesSent = videoBytesSent - lastVideoSent;
7400
+ networkStats.totalVideoBytesReceived = videoBytesReceived;
7401
+ networkStats.videoBytesReceived = videoBytesReceived - lastVideoReceived;
7402
+ networkStats.totalTransportSent = transportSent - lastTransportSent;
7358
7403
  networkStats.transportSent = transportSent;
7359
- networkStats.transportReceived = transportReceived;
7360
-
7361
- const bandwidth = (networkStats.audioBytesSent - lastAudioSent) + (networkStats.videoBytesSent - lastVideoSent)
7362
- + (networkStats.audioBytesReceived - lastAudioReceived) + (networkStats.videoBytesReceived - lastVideoReceived)
7363
- + (networkStats.transportReceived - lastTransportReceived) + (networkStats.transportSent - lastTransportSent);
7404
+ networkStats.totalTransportReceived = transportReceived;
7405
+ networkStats.transportReceived = transportReceived - lastTransportReceived;
7364
7406
 
7365
- networkStats.bandwidth = bandwidth;
7407
+ networkStats.bandwidth = networkStats.audioBytesSent + networkStats.audioBytesReceived
7408
+ + networkStats.videoBytesSent + networkStats.videoBytesReceived + networkStats.transportReceived
7409
+ + networkStats.transportSent;
7366
7410
 
7367
7411
  this.eventEmitter.emit(ON_NETWORK_STATS, session, networkStats, this.sessionNetworkStats[sessionId]);
7368
7412
  this.sessionNetworkStats[sessionId].push(networkStats);
@@ -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 => {
@@ -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,7 +952,8 @@ 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
  export default WebSocketClient;
934
- export { AGENT_PAUSED, AGENT_STATUS_UPDATE, AGENT_UNPAUSED, APPLICATION_CALL_ANSWERED, APPLICATION_CALL_DELETED, APPLICATION_CALL_DTMF_RECEIVED, APPLICATION_CALL_ENTERED, APPLICATION_CALL_INITIATED, APPLICATION_CALL_UPDATED, APPLICATION_DESTINATION_NODE_CREATED, APPLICATION_NODE_CREATED, APPLICATION_NODE_DELETED, APPLICATION_NODE_UPDATED, APPLICATION_PLAYBACK_CREATED, APPLICATION_PLAYBACK_DELETED, APPLICATION_PROGRESS_STARTED, APPLICATION_PROGRESS_STOPPED, APPLICATION_SNOOP_CREATED, APPLICATION_SNOOP_DELETED, APPLICATION_SNOOP_UPDATED, APPLICATION_USER_OUTGOING_CALL_CREATED, AUTH_SESSION_EXPIRE_SOON, AUTH_USER_EXTERNAL_AUTH_ADDED, AUTH_USER_EXTERNAL_AUTH_DELETED, CALL_ANSWERED, CALL_CREATED, CALL_DTMF_CREATED, CALL_ENDED, CALL_HELD, CALL_LOG_USER_CREATED, CALL_RESUMED, CALL_UPDATED, CHATD_PRESENCE_UPDATED, CHATD_USER_ROOM_CREATED, CHATD_USER_ROOM_MESSAGE_CREATED, CHAT_MESSAGE_RECEIVED, CHAT_MESSAGE_SENT, CONFERENCE_ADHOC_DELETED, CONFERENCE_ADHOC_PARTICIPANT_LEFT, CONFERENCE_USER_PARTICIPANT_JOINED, CONFERENCE_USER_PARTICIPANT_LEFT, CONFERENCE_USER_PARTICIPANT_TALK_STARTED, CONFERENCE_USER_PARTICIPANT_TALK_STOPPED, ENDPOINT_STATUS_UPDATE, FAVORITE_ADDED, FAVORITE_DELETED, FAX_OUTBOUND_USER_CREATED, FAX_OUTBOUND_USER_FAILED, FAX_OUTBOUND_USER_SUCCEEDED, HEARTBEAT_ENGINE_VERSION, LINE_STATUS_UPDATED, MEETING_USER_PARTICIPANT_JOINED, MEETING_USER_PARTICIPANT_LEFT, SOCKET_EVENTS, SWITCHBOARD_HELD_CALLS_UPDATED, SWITCHBOARD_HELD_CALL_ANSWERED, SWITCHBOARD_QUEUED_CALLS_UPDATED, SWITCHBOARD_QUEUED_CALL_ANSWERED, TRUNK_STATUS_UPDATED, USERS_FORWARDS_BUSY_UPDATED, USERS_FORWARDS_NOANSWER_UPDATED, USERS_FORWARDS_UNCONDITIONAL_UPDATED, USERS_SERVICES_DND_UPDATED, USER_STATUS_UPDATE, USER_VOICEMAIL_MESSAGE_CREATED, USER_VOICEMAIL_MESSAGE_DELETED, USER_VOICEMAIL_MESSAGE_UPDATED };
959
+ export { AGENT_PAUSED, AGENT_STATUS_UPDATE, AGENT_UNPAUSED, APPLICATION_CALL_ANSWERED, APPLICATION_CALL_DELETED, APPLICATION_CALL_DTMF_RECEIVED, APPLICATION_CALL_ENTERED, APPLICATION_CALL_INITIATED, APPLICATION_CALL_UPDATED, APPLICATION_DESTINATION_NODE_CREATED, APPLICATION_NODE_CREATED, APPLICATION_NODE_DELETED, APPLICATION_NODE_UPDATED, APPLICATION_PLAYBACK_CREATED, APPLICATION_PLAYBACK_DELETED, APPLICATION_PROGRESS_STARTED, APPLICATION_PROGRESS_STOPPED, APPLICATION_SNOOP_CREATED, APPLICATION_SNOOP_DELETED, APPLICATION_SNOOP_UPDATED, APPLICATION_USER_OUTGOING_CALL_CREATED, AUTH_SESSION_EXPIRE_SOON, AUTH_USER_EXTERNAL_AUTH_ADDED, AUTH_USER_EXTERNAL_AUTH_DELETED, CALL_ANSWERED, CALL_CREATED, CALL_DTMF_CREATED, CALL_ENDED, CALL_HELD, CALL_LOG_USER_CREATED, CALL_RESUMED, CALL_UPDATED, CHATD_PRESENCE_UPDATED, CHATD_USER_ROOM_CREATED, CHATD_USER_ROOM_MESSAGE_CREATED, CHAT_MESSAGE_RECEIVED, CHAT_MESSAGE_SENT, CONFERENCE_ADHOC_DELETED, CONFERENCE_ADHOC_PARTICIPANT_LEFT, CONFERENCE_USER_PARTICIPANT_JOINED, CONFERENCE_USER_PARTICIPANT_LEFT, CONFERENCE_USER_PARTICIPANT_TALK_STARTED, CONFERENCE_USER_PARTICIPANT_TALK_STOPPED, ENDPOINT_STATUS_UPDATE, FAVORITE_ADDED, FAVORITE_DELETED, FAX_OUTBOUND_USER_CREATED, FAX_OUTBOUND_USER_FAILED, FAX_OUTBOUND_USER_SUCCEEDED, HEARTBEAT_ENGINE_VERSION, LINE_STATUS_UPDATED, MEETING_USER_PARTICIPANT_JOINED, MEETING_USER_PARTICIPANT_LEFT, MEETING_USER_PROGRESS, SOCKET_EVENTS, SWITCHBOARD_HELD_CALLS_UPDATED, SWITCHBOARD_HELD_CALL_ANSWERED, SWITCHBOARD_QUEUED_CALLS_UPDATED, SWITCHBOARD_QUEUED_CALL_ANSWERED, TRUNK_STATUS_UPDATED, USERS_FORWARDS_BUSY_UPDATED, USERS_FORWARDS_NOANSWER_UPDATED, USERS_FORWARDS_UNCONDITIONAL_UPDATED, USERS_SERVICES_DND_UPDATED, USER_STATUS_UPDATE, USER_VOICEMAIL_MESSAGE_CREATED, USER_VOICEMAIL_MESSAGE_DELETED, USER_VOICEMAIL_MESSAGE_UPDATED };
@@ -136,6 +136,7 @@ class IssueReporter {
136
136
 
137
137
 
138
138
 
139
+
139
140
 
140
141
  constructor() {
141
142
  addLevelsTo(this);
@@ -147,12 +148,17 @@ class IssueReporter {
147
148
  this.bufferTimeout = null;
148
149
  this._boundProcessBuffer = this._processBuffer.bind(this);
149
150
  this._boundParseLoggerBody = this._parseLoggerBody.bind(this);
151
+ this._callback = null;
150
152
  }
151
153
 
152
154
  init() {
153
155
  this._catchConsole();
154
156
  }
155
157
 
158
+ setCallback(cb ) {
159
+ this._callback = cb;
160
+ }
161
+
156
162
  configureRemoteClient(configuration = { tag: 'wazo-sdk', host: null, port: null, level: null, extra: {} }) {
157
163
  this.remoteClientConfiguration = configuration;
158
164
  }
@@ -188,6 +194,7 @@ class IssueReporter {
188
194
 
189
195
  // Handle category label
190
196
  let category = null;
197
+ let skipSendToRemote = false;
191
198
  let extra = {};
192
199
  if (args[0].indexOf(CATEGORY_PREFIX) === 0) {
193
200
  category = args[0].split('=')[1];
@@ -203,6 +210,7 @@ class IssueReporter {
203
210
  errorMessage: lastArg.message,
204
211
  errorStack: lastArg.stack,
205
212
  errorType: lastArg.constructor.name,
213
+ skipSendToRemote: lastArg.skipSendToRemote,
206
214
  };
207
215
  } else {
208
216
  extra = lastArg;
@@ -211,6 +219,11 @@ class IssueReporter {
211
219
  args.splice(1, 1);
212
220
  }
213
221
 
222
+ if (extra.skipSendToRemote) {
223
+ skipSendToRemote = true;
224
+ delete extra.skipSendToRemote;
225
+ }
226
+
214
227
  const date = moment__default['default']().format('YYYY-MM-DD HH:mm:ss.SSS');
215
228
  const message = args.join(', ');
216
229
  let consoleMessage = message;
@@ -231,7 +244,13 @@ class IssueReporter {
231
244
  const oldMethod = this.oldConsoleMethods[consoleLevel] || this.oldConsoleMethods.log;
232
245
  oldMethod.apply(oldMethod, [date, consoleMessage]);
233
246
 
234
- this._sendToRemoteLogger(level, { date, message, category, ...extra });
247
+ if (this._callback) {
248
+ this._callback(level, consoleMessage);
249
+ }
250
+
251
+ if (!skipSendToRemote) {
252
+ this._sendToRemoteLogger(level, { date, message, category, ...extra });
253
+ }
235
254
  }
236
255
 
237
256
  logRequest(url , options , response , start ) {
@@ -376,7 +395,11 @@ class IssueReporter {
376
395
  },
377
396
  // $FlowFixMe
378
397
  body,
379
- }).catch(() => {
398
+ }).catch((e ) => {
399
+ // $FlowFixMe
400
+ e.skipSendToRemote = true;
401
+ this.log('error', this._makeCategory('grafana'), 'Sending log to grafana, error', e);
402
+
380
403
  setTimeout(() => {
381
404
  if (isArray) {
382
405
  payload = payload.map(message => {
@@ -1514,6 +1537,9 @@ class Contact {
1514
1537
  }
1515
1538
 
1516
1539
  static parseMany(response ) {
1540
+ if (!response || !response.results) {
1541
+ return [];
1542
+ }
1517
1543
  return response.results.map(r => Contact.parse(r, response.column_types));
1518
1544
  }
1519
1545
 
@@ -2620,11 +2646,27 @@ class Meeting {
2620
2646
  });
2621
2647
  }
2622
2648
 
2649
+ static parseMany(items ) {
2650
+ if (!items) {
2651
+ return [];
2652
+ }
2653
+ return items.map(plain => Meeting.parse(plain));
2654
+ }
2655
+
2623
2656
  static newFrom(meeting ) {
2624
2657
  return newFrom(meeting, Meeting);
2625
2658
  }
2626
2659
 
2627
- constructor({ uuid, name, guestSipAuthorization, ownerUuids, port, uri, number, persistent } = {}) {
2660
+ constructor({
2661
+ uuid,
2662
+ name,
2663
+ guestSipAuthorization,
2664
+ ownerUuids,
2665
+ port,
2666
+ uri,
2667
+ number,
2668
+ persistent,
2669
+ } = {}) {
2628
2670
  this.guestSipAuthorization = guestSipAuthorization;
2629
2671
  this.uri = uri;
2630
2672
  this.name = name;
@@ -2710,8 +2752,11 @@ var confdMethods = (client , baseUrl ) => ({
2710
2752
  }
2711
2753
  },
2712
2754
 
2713
- createMyMeeting: (name ) =>
2714
- client.post(`${baseUrl}/users/me/meetings`, { name }).then(Meeting.parse),
2755
+ getMyMeetings: () =>
2756
+ client.get(`${baseUrl}/users/me/meetings`).then(response => Meeting.parseMany(response.items)),
2757
+
2758
+ createMyMeeting: (name , persistent ) =>
2759
+ client.post(`${baseUrl}/users/me/meetings`, { name, persistent }).then(Meeting.parse),
2715
2760
 
2716
2761
  deleteMyMeeting: (meetingUuid ) =>
2717
2762
  client.delete(`${baseUrl}/users/me/meetings/${meetingUuid}`, null),
@@ -2807,6 +2852,10 @@ class ChatMessage {
2807
2852
 
2808
2853
 
2809
2854
  static parseMany(plain ) {
2855
+ if (!plain || !plain.items) {
2856
+ return [];
2857
+ }
2858
+
2810
2859
  return plain.items.map(item => ChatMessage.parse(item));
2811
2860
  }
2812
2861
 
@@ -2916,6 +2965,9 @@ class Voicemail {
2916
2965
  }
2917
2966
 
2918
2967
  static parseMany(plain ) {
2968
+ if (!plain) {
2969
+ return [];
2970
+ }
2919
2971
  const plainUnread = plain.folders.filter(folder => folder.type === 'new')[0].messages;
2920
2972
  const plainRead = plain.folders.filter(folder => folder.type === 'old')[0].messages;
2921
2973
 
@@ -3025,6 +3077,9 @@ class Call {
3025
3077
 
3026
3078
 
3027
3079
  static parseMany(plain ) {
3080
+ if (!plain) {
3081
+ return [];
3082
+ }
3028
3083
  return plain.map((plainCall ) => Call.parse(plainCall));
3029
3084
  }
3030
3085
 
@@ -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
 
@@ -3870,6 +3932,9 @@ class ChatRoom {
3870
3932
 
3871
3933
 
3872
3934
  static parseMany(plain ) {
3935
+ if (!plain || !plain.items) {
3936
+ return [];
3937
+ }
3873
3938
  return plain.items.map(item => ChatRoom.parse(item));
3874
3939
  }
3875
3940