@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
@@ -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
 
@@ -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
 
@@ -5698,7 +5725,9 @@ class WebRTCClient extends Emitter {
5698
5725
  const inviteOptions = {
5699
5726
  requestDelegate: {
5700
5727
  onAccept: (response ) => {
5701
- session.sessionDescriptionHandler.peerConnection.sfu = conference;
5728
+ if (session.sessionDescriptionHandler.peerConnection) {
5729
+ session.sessionDescriptionHandler.peerConnection.sfu = conference;
5730
+ }
5702
5731
  this._onAccepted(session, response.session, true);
5703
5732
  },
5704
5733
  onReject: (response ) => {
@@ -6570,6 +6599,16 @@ class WebRTCClient extends Emitter {
6570
6599
  return this.hasRemoteVideo(sessionId) ? this.getRemoteStream(sessionId) : null;
6571
6600
  }
6572
6601
 
6602
+ // Useful in a react-native environment when remoteMediaStream is not updated
6603
+ getRemoteVideoStreamFromPc(sessionId ) {
6604
+ const pc = this.getPeerConnection(sessionId);
6605
+ if (!pc) {
6606
+ return null;
6607
+ }
6608
+
6609
+ return pc.getRemoteStreams().find(stream => !!stream.getVideoTracks().length);
6610
+ }
6611
+
6573
6612
  hasVideo(sessionId ) {
6574
6613
  return this.hasLocalVideo(sessionId) || this.hasRemoteVideo(sessionId);
6575
6614
  }
@@ -7080,6 +7119,7 @@ class WebRTCClient extends Emitter {
7080
7119
  session.sessionDescriptionHandler.remoteMediaStream.onaddtrack = onTrack;
7081
7120
 
7082
7121
  pc.oniceconnectionstatechange = () => {
7122
+ logger.info('on ice connection state changed', { state: pc.iceConnectionState });
7083
7123
  if (pc.iceConnectionState === 'disconnected') {
7084
7124
  this.eventEmitter.emit(ON_DISCONNECTED);
7085
7125
  }
@@ -7308,25 +7348,25 @@ class WebRTCClient extends Emitter {
7308
7348
 
7309
7349
  stats.forEach(report => {
7310
7350
  if (report.type === 'outbound-rtp' && report.kind === 'audio') {
7311
- audioBytesSent += report.bytesSent + report.headerBytesSent;
7351
+ audioBytesSent += Number(report.bytesSent) + Number(report.headerBytesSent);
7312
7352
  }
7313
7353
  if (report.type === 'remote-outbound-rtp' && report.kind === 'audio') {
7314
- audioBytesSent += report.bytesSent;
7354
+ audioBytesSent += Number(report.bytesSent);
7315
7355
  }
7316
7356
  if (report.type === 'outbound-rtp' && report.kind === 'video') {
7317
- videoBytesSent += report.bytesSent + report.headerBytesSent;
7357
+ videoBytesSent += Number(report.bytesSent) + Number(report.headerBytesSent);
7318
7358
  }
7319
7359
  if (report.type === 'inbound-rtp' && report.kind === 'audio') {
7320
- packetsLost += report.packetsLost;
7321
- networkStats.packetsReceived = report.packetsReceived;
7322
- audioBytesReceived += report.bytesReceived + report.headerBytesReceived;
7360
+ packetsLost += Number(report.packetsLost);
7361
+ networkStats.packetsReceived = Number(report.packetsReceived);
7362
+ audioBytesReceived += Number(report.bytesReceived) + Number(report.headerBytesReceived);
7323
7363
  }
7324
7364
  if (report.type === 'inbound-rtp' && report.kind === 'video') {
7325
- videoBytesReceived += report.bytesReceived + report.headerBytesReceived;
7365
+ videoBytesReceived += Number(report.bytesReceived) + Number(report.headerBytesReceived);
7326
7366
  }
7327
7367
  if (report.type === 'outbound-rtp' && report.kind === 'video') {
7328
7368
  if ('framesPerSecond' in report) {
7329
- networkStats.framesPerSecond = report.framesPerSecond;
7369
+ networkStats.framesPerSecond = Number(report.framesPerSecond);
7330
7370
  }
7331
7371
  if ('framerateMean' in report) {
7332
7372
  // framerateMean is only available in FF
@@ -7334,32 +7374,36 @@ class WebRTCClient extends Emitter {
7334
7374
  }
7335
7375
  }
7336
7376
  if (report.type === 'remote-inbound-rtp' && report.kind === 'audio') {
7337
- packetsLost += report.packetsLost;
7338
- networkStats.roundTripTime = report.roundTripTime;
7339
- networkStats.jitter = report.jitter;
7377
+ packetsLost += Number(report.packetsLost);
7378
+ networkStats.roundTripTime = Number(report.roundTripTime);
7379
+ networkStats.jitter = Number(report.jitter);
7340
7380
  }
7341
7381
  if (report.type === 'remote-inbound-rtp' && report.kind === 'video') {
7342
- packetsLost += report.packetsLost;
7382
+ packetsLost += Number(report.packetsLost);
7343
7383
  }
7344
7384
  if (report.type === 'transport') {
7345
- transportSent += report.bytesSent;
7346
- transportReceived += report.bytesReceived;
7385
+ transportSent += Number(report.bytesSent);
7386
+ transportReceived += Number(report.bytesReceived);
7347
7387
  }
7348
7388
  });
7349
7389
 
7350
7390
  networkStats.packetsLost = packetsLost;
7351
- networkStats.audioBytesSent = audioBytesSent;
7391
+ networkStats.totalAudioBytesSent = audioBytesSent;
7392
+ networkStats.audioBytesSent = audioBytesSent - lastAudioSent;
7393
+ networkStats.totalAudioBytesReceived = audioBytesReceived - lastAudioReceived;
7352
7394
  networkStats.audioBytesReceived = audioBytesReceived;
7353
- networkStats.videoBytesSent = videoBytesSent;
7354
- networkStats.videoBytesReceived = videoBytesReceived;
7395
+ networkStats.totalVideoBytesSent = videoBytesSent;
7396
+ networkStats.videoBytesSent = videoBytesSent - lastVideoSent;
7397
+ networkStats.totalVideoBytesReceived = videoBytesReceived;
7398
+ networkStats.videoBytesReceived = videoBytesReceived - lastVideoReceived;
7399
+ networkStats.totalTransportSent = transportSent - lastTransportSent;
7355
7400
  networkStats.transportSent = transportSent;
7356
- networkStats.transportReceived = transportReceived;
7357
-
7358
- const bandwidth = (networkStats.audioBytesSent - lastAudioSent) + (networkStats.videoBytesSent - lastVideoSent)
7359
- + (networkStats.audioBytesReceived - lastAudioReceived) + (networkStats.videoBytesReceived - lastVideoReceived)
7360
- + (networkStats.transportReceived - lastTransportReceived) + (networkStats.transportSent - lastTransportSent);
7401
+ networkStats.totalTransportReceived = transportReceived;
7402
+ networkStats.transportReceived = transportReceived - lastTransportReceived;
7361
7403
 
7362
- networkStats.bandwidth = bandwidth;
7404
+ networkStats.bandwidth = networkStats.audioBytesSent + networkStats.audioBytesReceived
7405
+ + networkStats.videoBytesSent + networkStats.videoBytesReceived + networkStats.transportReceived
7406
+ + networkStats.transportSent;
7363
7407
 
7364
7408
  this.eventEmitter.emit(ON_NETWORK_STATS, session, networkStats, this.sessionNetworkStats[sessionId]);
7365
7409
  this.sessionNetworkStats[sessionId].push(networkStats);
package/esm/api/agentd.js CHANGED
@@ -126,6 +126,7 @@ class IssueReporter {
126
126
 
127
127
 
128
128
 
129
+
129
130
 
130
131
  constructor() {
131
132
  addLevelsTo(this);
@@ -137,12 +138,17 @@ class IssueReporter {
137
138
  this.bufferTimeout = null;
138
139
  this._boundProcessBuffer = this._processBuffer.bind(this);
139
140
  this._boundParseLoggerBody = this._parseLoggerBody.bind(this);
141
+ this._callback = null;
140
142
  }
141
143
 
142
144
  init() {
143
145
  this._catchConsole();
144
146
  }
145
147
 
148
+ setCallback(cb ) {
149
+ this._callback = cb;
150
+ }
151
+
146
152
  configureRemoteClient(configuration = { tag: 'wazo-sdk', host: null, port: null, level: null, extra: {} }) {
147
153
  this.remoteClientConfiguration = configuration;
148
154
  }
@@ -178,6 +184,7 @@ class IssueReporter {
178
184
 
179
185
  // Handle category label
180
186
  let category = null;
187
+ let skipSendToRemote = false;
181
188
  let extra = {};
182
189
  if (args[0].indexOf(CATEGORY_PREFIX) === 0) {
183
190
  category = args[0].split('=')[1];
@@ -193,6 +200,7 @@ class IssueReporter {
193
200
  errorMessage: lastArg.message,
194
201
  errorStack: lastArg.stack,
195
202
  errorType: lastArg.constructor.name,
203
+ skipSendToRemote: lastArg.skipSendToRemote,
196
204
  };
197
205
  } else {
198
206
  extra = lastArg;
@@ -201,6 +209,11 @@ class IssueReporter {
201
209
  args.splice(1, 1);
202
210
  }
203
211
 
212
+ if (extra.skipSendToRemote) {
213
+ skipSendToRemote = true;
214
+ delete extra.skipSendToRemote;
215
+ }
216
+
204
217
  const date = moment().format('YYYY-MM-DD HH:mm:ss.SSS');
205
218
  const message = args.join(', ');
206
219
  let consoleMessage = message;
@@ -221,7 +234,13 @@ class IssueReporter {
221
234
  const oldMethod = this.oldConsoleMethods[consoleLevel] || this.oldConsoleMethods.log;
222
235
  oldMethod.apply(oldMethod, [date, consoleMessage]);
223
236
 
224
- this._sendToRemoteLogger(level, { date, message, category, ...extra });
237
+ if (this._callback) {
238
+ this._callback(level, consoleMessage);
239
+ }
240
+
241
+ if (!skipSendToRemote) {
242
+ this._sendToRemoteLogger(level, { date, message, category, ...extra });
243
+ }
225
244
  }
226
245
 
227
246
  logRequest(url , options , response , start ) {
@@ -366,7 +385,11 @@ class IssueReporter {
366
385
  },
367
386
  // $FlowFixMe
368
387
  body,
369
- }).catch(() => {
388
+ }).catch((e ) => {
389
+ // $FlowFixMe
390
+ e.skipSendToRemote = true;
391
+ this.log('error', this._makeCategory('grafana'), 'Sending log to grafana, error', e);
392
+
370
393
  setTimeout(() => {
371
394
  if (isArray) {
372
395
  payload = payload.map(message => {