@wazo/sdk 0.37.18 → 0.37.22

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (163) hide show
  1. package/dist/wazo-sdk.js +13 -5
  2. package/esm/__tests__/api-client.test.js +52 -9
  3. package/esm/__tests__/web-rtc-client.test.js +80 -20
  4. package/esm/api/agentd.js +27 -4
  5. package/esm/api/amid.js +27 -4
  6. package/esm/api/application.js +27 -4
  7. package/esm/api/auth.js +29 -5
  8. package/esm/api/call-logd.js +29 -6
  9. package/esm/api/calld.js +27 -4
  10. package/esm/api/chatd.js +27 -4
  11. package/esm/api/confd.js +51 -8
  12. package/esm/api/ctid-ng.js +27 -4
  13. package/esm/api/dird.js +27 -4
  14. package/esm/api/webhookd.js +27 -4
  15. package/esm/api-client.js +54 -11
  16. package/esm/checker/Checker.js +83 -21
  17. package/esm/checker/checks/aor.js +54 -11
  18. package/esm/checker/checks/api.js +54 -11
  19. package/esm/checker/checks/ice-ipv4.js +1 -1
  20. package/esm/checker/checks/index.js +84 -22
  21. package/esm/checker/checks/symmetric-nat.js +1 -1
  22. package/esm/checker/checks/wazo-websocket.js +29 -4
  23. package/esm/checker/checks/webrtc-transport.js +82 -22
  24. package/esm/checker/checks/webrtc.js +82 -22
  25. package/esm/domain/AdHocAPIConference.js +54 -11
  26. package/esm/domain/Agent.js +1 -1
  27. package/esm/domain/BadResponse.js +1 -1
  28. package/esm/domain/Call.js +1 -1
  29. package/esm/domain/CallLog.js +3 -3
  30. package/esm/domain/CallSession.js +1 -1
  31. package/esm/domain/ChatMessage.js +1 -1
  32. package/esm/domain/ChatRoom.js +1 -1
  33. package/esm/domain/Contact.js +2 -1
  34. package/esm/domain/Country.js +1 -1
  35. package/esm/domain/Device/DebugDevice.js +1 -1
  36. package/esm/domain/ExternalApp.js +1 -1
  37. package/esm/domain/Features.js +54 -10
  38. package/esm/domain/ForwardOption.js +2 -1
  39. package/esm/domain/IndirectTransfer.js +1 -1
  40. package/esm/domain/Line.js +1 -1
  41. package/esm/domain/Meeting.js +20 -3
  42. package/esm/domain/NotificationOptions.js +1 -1
  43. package/esm/domain/Phone/CTIPhone.js +55 -11
  44. package/esm/domain/Phone/WebRTCPhone.js +39 -6
  45. package/esm/domain/Profile.js +2 -1
  46. package/esm/domain/Recording.js +2 -2
  47. package/esm/domain/Relocation.js +1 -1
  48. package/esm/domain/Room.js +1 -1
  49. package/esm/domain/ServerError.js +1 -1
  50. package/esm/domain/Session.js +2 -2
  51. package/esm/domain/SipLine.js +1 -1
  52. package/esm/domain/Subscription.js +1 -1
  53. package/esm/domain/SwitchboardCall.js +1 -1
  54. package/esm/domain/Voicemail.js +1 -1
  55. package/esm/domain/__tests__/CallLog.test.js +2 -2
  56. package/esm/index.js +101 -24
  57. package/esm/lib/WazoSessionDescriptionHandler.js +28 -4
  58. package/esm/service/CallApi.js +54 -11
  59. package/esm/service/IssueReporter.js +27 -4
  60. package/esm/service/__tests__/IssueReporter.test.js +26 -3
  61. package/esm/service/getApiClient.js +55 -11
  62. package/esm/simple/Auth.js +101 -23
  63. package/esm/simple/Configuration.js +100 -23
  64. package/esm/simple/Directory.js +53 -10
  65. package/esm/simple/Phone.js +100 -23
  66. package/esm/simple/Websocket.js +30 -4
  67. package/esm/simple/index.js +100 -23
  68. package/esm/simple/room/LocalParticipant.js +113 -40
  69. package/esm/simple/room/Participant.js +112 -37
  70. package/esm/simple/room/RemoteParticipant.js +114 -41
  71. package/esm/simple/room/Room.js +113 -37
  72. package/esm/simple/room/SipRoom.js +101 -26
  73. package/esm/simple/room/Stream.js +101 -26
  74. package/esm/simple/room/__tests__/RemoteParticipant.test.js +99 -22
  75. package/esm/simple/utils.js +99 -22
  76. package/esm/utils/Emitter.js +1 -1
  77. package/esm/utils/Heartbeat.js +1 -1
  78. package/esm/utils/__tests__/api-requester.test.js +26 -3
  79. package/esm/utils/api-requester.js +28 -4
  80. package/esm/utils/compare-version.js +1 -1
  81. package/esm/utils/isMobile.js +1 -1
  82. package/esm/utils/new-from.js +1 -1
  83. package/esm/utils/once.js +1 -1
  84. package/esm/utils/update-from.js +1 -1
  85. package/esm/web-rtc-client.js +83 -22
  86. package/esm/websocket-client.js +30 -4
  87. package/lib/__tests__/api-client.test.js +61 -18
  88. package/lib/__tests__/web-rtc-client.test.js +97 -37
  89. package/lib/api/agentd.js +27 -4
  90. package/lib/api/amid.js +27 -4
  91. package/lib/api/application.js +27 -4
  92. package/lib/api/auth.js +28 -5
  93. package/lib/api/call-logd.js +34 -11
  94. package/lib/api/calld.js +30 -7
  95. package/lib/api/chatd.js +28 -5
  96. package/lib/api/confd.js +51 -8
  97. package/lib/api/ctid-ng.js +30 -7
  98. package/lib/api/dird.js +27 -4
  99. package/lib/api/webhookd.js +27 -4
  100. package/lib/api-client.js +61 -18
  101. package/lib/checker/Checker.js +100 -38
  102. package/lib/checker/checks/aor.js +61 -18
  103. package/lib/checker/checks/api.js +61 -18
  104. package/lib/checker/checks/index.js +100 -38
  105. package/lib/checker/checks/wazo-websocket.js +31 -6
  106. package/lib/checker/checks/webrtc-transport.js +97 -37
  107. package/lib/checker/checks/webrtc.js +97 -37
  108. package/lib/domain/AdHocAPIConference.js +61 -18
  109. package/lib/domain/Call.js +1 -1
  110. package/lib/domain/CallLog.js +7 -7
  111. package/lib/domain/ChatMessage.js +1 -1
  112. package/lib/domain/Contact.js +1 -1
  113. package/lib/domain/Features.js +62 -19
  114. package/lib/domain/ForwardOption.js +1 -1
  115. package/lib/domain/Meeting.js +19 -2
  116. package/lib/domain/Phone/CTIPhone.js +63 -20
  117. package/lib/domain/Phone/WebRTCPhone.js +40 -8
  118. package/lib/domain/Profile.js +1 -1
  119. package/lib/domain/Recording.js +3 -3
  120. package/lib/domain/Voicemail.js +1 -1
  121. package/lib/domain/__tests__/Call.test.js +1 -1
  122. package/lib/domain/__tests__/CallLog.test.js +13 -13
  123. package/lib/domain/__tests__/Voicemail.test.js +1 -1
  124. package/lib/index.js +120 -43
  125. package/lib/lib/WazoSessionDescriptionHandler.js +32 -9
  126. package/lib/service/CallApi.js +61 -18
  127. package/lib/service/IssueReporter.js +27 -4
  128. package/lib/service/__tests__/IssueReporter.test.js +27 -4
  129. package/lib/service/getApiClient.js +62 -19
  130. package/lib/simple/Auth.js +119 -42
  131. package/lib/simple/Configuration.js +118 -41
  132. package/lib/simple/Directory.js +61 -18
  133. package/lib/simple/Phone.js +118 -41
  134. package/lib/simple/Websocket.js +32 -6
  135. package/lib/simple/index.js +118 -41
  136. package/lib/simple/room/LocalParticipant.js +132 -59
  137. package/lib/simple/room/Participant.js +130 -55
  138. package/lib/simple/room/RemoteParticipant.js +133 -60
  139. package/lib/simple/room/Room.js +131 -56
  140. package/lib/simple/room/SipRoom.js +120 -45
  141. package/lib/simple/room/Stream.js +120 -45
  142. package/lib/simple/room/__tests__/RemoteParticipant.test.js +118 -41
  143. package/lib/simple/utils.js +118 -41
  144. package/lib/utils/Emitter.js +1 -1
  145. package/lib/utils/PhoneNumberUtil.js +2 -2
  146. package/lib/utils/__tests__/PhoneNumberUtil.test.js +2 -2
  147. package/lib/utils/__tests__/api-requester.test.js +27 -4
  148. package/lib/utils/__tests__/sdp.test.js +12 -12
  149. package/lib/utils/api-requester.js +28 -5
  150. package/lib/utils/sdp.js +10 -10
  151. package/lib/web-rtc-client.js +98 -38
  152. package/lib/websocket-client.js +33 -7
  153. package/package.json +2 -2
  154. package/src/api/confd.js +5 -2
  155. package/src/domain/CallLog.js +1 -1
  156. package/src/domain/Meeting.js +19 -2
  157. package/src/domain/Phone/WebRTCPhone.js +11 -2
  158. package/src/domain/Recording.js +1 -1
  159. package/src/service/IssueReporter.js +26 -3
  160. package/src/simple/Phone.js +5 -0
  161. package/src/types/WebSocketMessage.js +5 -1
  162. package/src/web-rtc-client.js +28 -11
  163. package/src/websocket-client.js +2 -0
@@ -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,7 +504,12 @@ class IssueReporter {
496
504
  args.splice(1, 1);
497
505
  }
498
506
 
499
- const date = moment__default["default"]().format('YYYY-MM-DD HH:mm:ss.SSS');
507
+ if (extra.skipSendToRemote) {
508
+ skipSendToRemote = true;
509
+ delete extra.skipSendToRemote;
510
+ }
511
+
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;
502
515
 
@@ -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 => {
@@ -673,7 +696,7 @@ class IssueReporter {
673
696
  payload._retry = retry + 1;
674
697
  }
675
698
 
676
- this._sendDebugToGrafana(body, retry + 1);
699
+ this._sendDebugToGrafana(payload, retry + 1);
677
700
  }, 5000 + retry * 1000);
678
701
  });
679
702
  }
@@ -701,7 +724,7 @@ const parseCandidate = (candidate ) => {
701
724
  if (!candidate) {
702
725
  return null;
703
726
  }
704
- const result = sdpParser__default["default"].parse(candidate.indexOf('a=') === 0 ? candidate : `a=${candidate}`);
727
+ const result = sdpParser__default['default'].parse(candidate.indexOf('a=') === 0 ? candidate : `a=${candidate}`);
705
728
 
706
729
  return result.candidates ? result.candidates[0] : null;
707
730
  };
@@ -715,7 +738,7 @@ const areCandidateValid = (candidates ) =>
715
738
  .length > 0;
716
739
 
717
740
  const getVideoDirection = (sdp ) => {
718
- const parsedSdp = sdpParser__default["default"].parse(sdp);
741
+ const parsedSdp = sdpParser__default['default'].parse(sdp);
719
742
  const videoMedia = parsedSdp.media.find(media => media.type === 'video');
720
743
  if (!videoMedia) {
721
744
  return null;
@@ -729,14 +752,14 @@ const hasAnActiveVideo = (sdp ) => {
729
752
  return false;
730
753
  }
731
754
 
732
- const parsedSdp = sdpParser__default["default"].parse(sdp);
755
+ const parsedSdp = sdpParser__default['default'].parse(sdp);
733
756
 
734
757
  return !!parsedSdp.media.find(media =>
735
758
  media.type === 'video' && media.port > 10 && (!media.direction || media.direction !== 'inactive'));
736
759
  };
737
760
 
738
761
  const fixSdp = (sdp , candidates , forcePort = true) => {
739
- const parsedSdp = sdpParser__default["default"].parse(sdp);
762
+ const parsedSdp = sdpParser__default['default'].parse(sdp);
740
763
  const mainCandidate = getSrflxOrRelay(candidates)[0];
741
764
  const ip = mainCandidate ? mainCandidate.ip : null;
742
765
 
@@ -754,7 +777,7 @@ const fixSdp = (sdp , candidates , forcePort = true)
754
777
  };
755
778
  });
756
779
 
757
- let fixed = sdpParser__default["default"].write(parsedSdp);
780
+ let fixed = sdpParser__default['default'].write(parsedSdp);
758
781
 
759
782
  if (ip) {
760
783
  fixed = fixed.replace(/IN IP4 0.0.0.0/g, `IN IP4 ${ip}`);
@@ -800,7 +823,7 @@ class WazoSessionDescriptionHandler extends sessionDescriptionHandler.SessionDes
800
823
  ) {
801
824
  super(logger, mediaStreamFactory, sessionDescriptionHandlerConfiguration);
802
825
 
803
- this.eventEmitter = new EventEmitter__default["default"]();
826
+ this.eventEmitter = new EventEmitter__default['default']();
804
827
  this.isWeb = isWeb;
805
828
  this.session = session;
806
829
  }
@@ -1239,7 +1262,7 @@ class Emitter {
1239
1262
 
1240
1263
 
1241
1264
  constructor() {
1242
- this.eventEmitter = new EventEmitter__default["default"]();
1265
+ this.eventEmitter = new EventEmitter__default['default']();
1243
1266
  }
1244
1267
 
1245
1268
  on(event , callback ) {
@@ -3175,7 +3198,8 @@ class ExternalApp {
3175
3198
 
3176
3199
 
3177
3200
 
3178
-
3201
+
3202
+
3179
3203
 
3180
3204
 
3181
3205
  class Meeting {
@@ -3187,6 +3211,7 @@ class Meeting {
3187
3211
 
3188
3212
 
3189
3213
 
3214
+
3190
3215
 
3191
3216
 
3192
3217
  static parse(plain ) {
@@ -3198,14 +3223,28 @@ class Meeting {
3198
3223
  port: plain.port,
3199
3224
  uuid: plain.uuid,
3200
3225
  number: plain.number,
3226
+ persistent: plain.persistent,
3201
3227
  });
3202
3228
  }
3203
3229
 
3230
+ static parseMany(items ) {
3231
+ return items.map(plain => Meeting.parse(plain));
3232
+ }
3233
+
3204
3234
  static newFrom(meeting ) {
3205
3235
  return newFrom(meeting, Meeting);
3206
3236
  }
3207
3237
 
3208
- constructor({ uuid, name, guestSipAuthorization, ownerUuids, port, uri, number } = {}) {
3238
+ constructor({
3239
+ uuid,
3240
+ name,
3241
+ guestSipAuthorization,
3242
+ ownerUuids,
3243
+ port,
3244
+ uri,
3245
+ number,
3246
+ persistent,
3247
+ } = {}) {
3209
3248
  this.guestSipAuthorization = guestSipAuthorization;
3210
3249
  this.uri = uri;
3211
3250
  this.name = name;
@@ -3213,6 +3252,7 @@ class Meeting {
3213
3252
  this.port = port;
3214
3253
  this.uuid = uuid;
3215
3254
  this.number = number;
3255
+ this.persistent = persistent;
3216
3256
 
3217
3257
  // Useful to compare instead of instanceof with minified code
3218
3258
  this.type = 'Meeting';
@@ -3290,8 +3330,11 @@ var confdMethods = (client , baseUrl ) => ({
3290
3330
  }
3291
3331
  },
3292
3332
 
3293
- createMyMeeting: (name ) =>
3294
- client.post(`${baseUrl}/users/me/meetings`, { name }).then(Meeting.parse),
3333
+ getMyMeetings: () =>
3334
+ client.get(`${baseUrl}/users/me/meetings`).then(response => Meeting.parseMany(response.items)),
3335
+
3336
+ createMyMeeting: (name , persistent ) =>
3337
+ client.post(`${baseUrl}/users/me/meetings`, { name, persistent }).then(Meeting.parse),
3295
3338
 
3296
3339
  deleteMyMeeting: (meetingUuid ) =>
3297
3340
  client.delete(`${baseUrl}/users/me/meetings/${meetingUuid}`, null),
@@ -3393,7 +3436,7 @@ class ChatMessage {
3393
3436
  static parse(plain ) {
3394
3437
  return new ChatMessage({
3395
3438
  uuid: plain.uuid,
3396
- date: moment__default["default"](plain.created_at).toDate(),
3439
+ date: moment__default['default'](plain.created_at).toDate(),
3397
3440
  content: plain.content,
3398
3441
  alias: plain.alias,
3399
3442
  userUuid: plain.user_uuid,
@@ -3485,7 +3528,7 @@ class Voicemail {
3485
3528
  static parse(plain ) {
3486
3529
  return new Voicemail({
3487
3530
  id: plain.id,
3488
- date: moment__default["default"](plain.timestamp * 1000).toDate(),
3531
+ date: moment__default['default'](plain.timestamp * 1000).toDate(),
3489
3532
  duration: plain.duration * 1000,
3490
3533
  caller: {
3491
3534
  name: plain.caller_id_name,
@@ -3622,7 +3665,7 @@ class Call {
3622
3665
  onHold: plain.on_hold,
3623
3666
  status: plain.status,
3624
3667
  lineId: plain.line_id,
3625
- startingTime: moment__default["default"](plain.creation_time).toDate(),
3668
+ startingTime: moment__default['default'](plain.creation_time).toDate(),
3626
3669
  talkingToIds: Object.keys(plain.talking_to || {}),
3627
3670
  recording: plain.record_state === RECORD_STATE_ACTIVE,
3628
3671
  });
@@ -3776,7 +3819,7 @@ class Recording {
3776
3819
 
3777
3820
 
3778
3821
 
3779
- static parseMany(recordings ) {
3822
+ static parseMany(recordings = []) {
3780
3823
  return recordings.map(item => Recording.parse(item));
3781
3824
  }
3782
3825
 
@@ -3784,8 +3827,8 @@ class Recording {
3784
3827
  return new Recording({
3785
3828
  deleted: plain.deleted,
3786
3829
  fileName: plain.filename,
3787
- end: plain.end_time ? moment__default["default"](plain.end_time).toDate() : null,
3788
- start: moment__default["default"](plain.start_time).toDate(),
3830
+ end: plain.end_time ? moment__default['default'](plain.end_time).toDate() : null,
3831
+ start: moment__default['default'](plain.start_time).toDate(),
3789
3832
  uuid: plain.uuid,
3790
3833
  });
3791
3834
  }
@@ -3883,7 +3926,7 @@ class CallLog {
3883
3926
 
3884
3927
  static parse(plain ) {
3885
3928
  return new CallLog({
3886
- answer: plain.answer ? moment__default["default"](plain.answer).toDate() : null,
3929
+ answer: plain.answer ? moment__default['default'](plain.answer).toDate() : null,
3887
3930
  answered: plain.answered,
3888
3931
  callDirection: plain.call_direction,
3889
3932
  destination: {
@@ -3900,9 +3943,9 @@ class CallLog {
3900
3943
  },
3901
3944
  id: plain.id,
3902
3945
  duration: (plain.duration || 0) * 1000, // duration is in seconds
3903
- start: moment__default["default"](plain.start).toDate(),
3904
- end: plain.end ? moment__default["default"](plain.end).toDate() : null,
3905
- recordings: Recording.parseMany(plain.recordings),
3946
+ start: moment__default['default'](plain.start).toDate(),
3947
+ end: plain.end ? moment__default['default'](plain.end).toDate() : null,
3948
+ recordings: Recording.parseMany(plain.recordings || []),
3906
3949
  });
3907
3950
  }
3908
3951
 
@@ -5703,7 +5746,9 @@ class WebRTCClient extends Emitter {
5703
5746
  const inviteOptions = {
5704
5747
  requestDelegate: {
5705
5748
  onAccept: (response ) => {
5706
- session.sessionDescriptionHandler.peerConnection.sfu = conference;
5749
+ if (session.sessionDescriptionHandler.peerConnection) {
5750
+ session.sessionDescriptionHandler.peerConnection.sfu = conference;
5751
+ }
5707
5752
  this._onAccepted(session, response.session, true);
5708
5753
  },
5709
5754
  onReject: (response ) => {
@@ -6039,7 +6084,7 @@ class WebRTCClient extends Emitter {
6039
6084
  // We search for the last transceiver without `video-` in the mid (video- means remote transceiver)
6040
6085
  const transceivers = pc.getTransceivers();
6041
6086
  const transceiverIdx = lastIndexOf(transceivers, transceiver =>
6042
- transceiver.sender.track === null && transceiver.mid.indexOf('video') === -1);
6087
+ transceiver.sender.track === null && transceiver.mid && transceiver.mid.indexOf('video') === -1);
6043
6088
 
6044
6089
  videoSender = transceiverIdx !== -1 ? transceivers[transceiverIdx].sender : null;
6045
6090
  } else {
@@ -6575,6 +6620,16 @@ class WebRTCClient extends Emitter {
6575
6620
  return this.hasRemoteVideo(sessionId) ? this.getRemoteStream(sessionId) : null;
6576
6621
  }
6577
6622
 
6623
+ // Useful in a react-native environment when remoteMediaStream is not updated
6624
+ getRemoteVideoStreamFromPc(sessionId ) {
6625
+ const pc = this.getPeerConnection(sessionId);
6626
+ if (!pc) {
6627
+ return null;
6628
+ }
6629
+
6630
+ return pc.getRemoteStreams().find(stream => !!stream.getVideoTracks().length);
6631
+ }
6632
+
6578
6633
  hasVideo(sessionId ) {
6579
6634
  return this.hasLocalVideo(sessionId) || this.hasRemoteVideo(sessionId);
6580
6635
  }
@@ -7085,6 +7140,7 @@ class WebRTCClient extends Emitter {
7085
7140
  session.sessionDescriptionHandler.remoteMediaStream.onaddtrack = onTrack;
7086
7141
 
7087
7142
  pc.oniceconnectionstatechange = () => {
7143
+ logger.info('on ice connection state changed', { state: pc.iceConnectionState });
7088
7144
  if (pc.iceConnectionState === 'disconnected') {
7089
7145
  this.eventEmitter.emit(ON_DISCONNECTED);
7090
7146
  }
@@ -7244,7 +7300,7 @@ class WebRTCClient extends Emitter {
7244
7300
  }
7245
7301
  const sessionId = this.getSipSessionId(session);
7246
7302
 
7247
- getStats__default["default"](pc, (result ) => {
7303
+ getStats__default['default'](pc, (result ) => {
7248
7304
  const { results, internal, nomore, ...stats } = result;
7249
7305
  this.statsIntervals[sessionId] = nomore;
7250
7306
 
@@ -7353,18 +7409,22 @@ class WebRTCClient extends Emitter {
7353
7409
  });
7354
7410
 
7355
7411
  networkStats.packetsLost = packetsLost;
7356
- networkStats.audioBytesSent = audioBytesSent;
7412
+ networkStats.totalAudioBytesSent = audioBytesSent;
7413
+ networkStats.audioBytesSent = audioBytesSent - lastAudioSent;
7414
+ networkStats.totalAudioBytesReceived = audioBytesReceived - lastAudioReceived;
7357
7415
  networkStats.audioBytesReceived = audioBytesReceived;
7358
- networkStats.videoBytesSent = videoBytesSent;
7359
- networkStats.videoBytesReceived = videoBytesReceived;
7416
+ networkStats.totalVideoBytesSent = videoBytesSent;
7417
+ networkStats.videoBytesSent = videoBytesSent - lastVideoSent;
7418
+ networkStats.totalVideoBytesReceived = videoBytesReceived;
7419
+ networkStats.videoBytesReceived = videoBytesReceived - lastVideoReceived;
7420
+ networkStats.totalTransportSent = transportSent - lastTransportSent;
7360
7421
  networkStats.transportSent = transportSent;
7361
- networkStats.transportReceived = transportReceived;
7362
-
7363
- const bandwidth = (networkStats.audioBytesSent - lastAudioSent) + (networkStats.videoBytesSent - lastVideoSent)
7364
- + (networkStats.audioBytesReceived - lastAudioReceived) + (networkStats.videoBytesReceived - lastVideoReceived)
7365
- + (networkStats.transportReceived - lastTransportReceived) + (networkStats.transportSent - lastTransportSent);
7422
+ networkStats.totalTransportReceived = transportReceived;
7423
+ networkStats.transportReceived = transportReceived - lastTransportReceived;
7366
7424
 
7367
- networkStats.bandwidth = bandwidth;
7425
+ networkStats.bandwidth = networkStats.audioBytesSent + networkStats.audioBytesReceived
7426
+ + networkStats.videoBytesSent + networkStats.videoBytesReceived + networkStats.transportReceived
7427
+ + networkStats.transportSent;
7368
7428
 
7369
7429
  this.eventEmitter.emit(ON_NETWORK_STATS, session, networkStats, this.sessionNetworkStats[sessionId]);
7370
7430
  this.sessionNetworkStats[sessionId].push(networkStats);
@@ -99,7 +99,7 @@ class Call {
99
99
  onHold: plain.on_hold,
100
100
  status: plain.status,
101
101
  lineId: plain.line_id,
102
- startingTime: moment__default["default"](plain.creation_time).toDate(),
102
+ startingTime: moment__default['default'](plain.creation_time).toDate(),
103
103
  talkingToIds: Object.keys(plain.talking_to || {}),
104
104
  recording: plain.record_state === RECORD_STATE_ACTIVE,
105
105
  });
@@ -353,6 +353,7 @@ class IssueReporter {
353
353
 
354
354
 
355
355
 
356
+
356
357
 
357
358
  constructor() {
358
359
  addLevelsTo(this);
@@ -364,12 +365,17 @@ class IssueReporter {
364
365
  this.bufferTimeout = null;
365
366
  this._boundProcessBuffer = this._processBuffer.bind(this);
366
367
  this._boundParseLoggerBody = this._parseLoggerBody.bind(this);
368
+ this._callback = null;
367
369
  }
368
370
 
369
371
  init() {
370
372
  this._catchConsole();
371
373
  }
372
374
 
375
+ setCallback(cb ) {
376
+ this._callback = cb;
377
+ }
378
+
373
379
  configureRemoteClient(configuration = { tag: 'wazo-sdk', host: null, port: null, level: null, extra: {} }) {
374
380
  this.remoteClientConfiguration = configuration;
375
381
  }
@@ -405,6 +411,7 @@ class IssueReporter {
405
411
 
406
412
  // Handle category label
407
413
  let category = null;
414
+ let skipSendToRemote = false;
408
415
  let extra = {};
409
416
  if (args[0].indexOf(CATEGORY_PREFIX) === 0) {
410
417
  category = args[0].split('=')[1];
@@ -420,6 +427,7 @@ class IssueReporter {
420
427
  errorMessage: lastArg.message,
421
428
  errorStack: lastArg.stack,
422
429
  errorType: lastArg.constructor.name,
430
+ skipSendToRemote: lastArg.skipSendToRemote,
423
431
  };
424
432
  } else {
425
433
  extra = lastArg;
@@ -428,7 +436,12 @@ class IssueReporter {
428
436
  args.splice(1, 1);
429
437
  }
430
438
 
431
- const date = moment__default["default"]().format('YYYY-MM-DD HH:mm:ss.SSS');
439
+ if (extra.skipSendToRemote) {
440
+ skipSendToRemote = true;
441
+ delete extra.skipSendToRemote;
442
+ }
443
+
444
+ const date = moment__default['default']().format('YYYY-MM-DD HH:mm:ss.SSS');
432
445
  const message = args.join(', ');
433
446
  let consoleMessage = message;
434
447
 
@@ -448,7 +461,13 @@ class IssueReporter {
448
461
  const oldMethod = this.oldConsoleMethods[consoleLevel] || this.oldConsoleMethods.log;
449
462
  oldMethod.apply(oldMethod, [date, consoleMessage]);
450
463
 
451
- this._sendToRemoteLogger(level, { date, message, category, ...extra });
464
+ if (this._callback) {
465
+ this._callback(level, consoleMessage);
466
+ }
467
+
468
+ if (!skipSendToRemote) {
469
+ this._sendToRemoteLogger(level, { date, message, category, ...extra });
470
+ }
452
471
  }
453
472
 
454
473
  logRequest(url , options , response , start ) {
@@ -593,7 +612,11 @@ class IssueReporter {
593
612
  },
594
613
  // $FlowFixMe
595
614
  body,
596
- }).catch(() => {
615
+ }).catch((e ) => {
616
+ // $FlowFixMe
617
+ e.skipSendToRemote = true;
618
+ this.log('error', this._makeCategory('grafana'), 'Sending log to grafana, error', e);
619
+
597
620
  setTimeout(() => {
598
621
  if (isArray) {
599
622
  payload = payload.map(message => {
@@ -605,7 +628,7 @@ class IssueReporter {
605
628
  payload._retry = retry + 1;
606
629
  }
607
630
 
608
- this._sendDebugToGrafana(body, retry + 1);
631
+ this._sendDebugToGrafana(payload, retry + 1);
609
632
  }, 5000 + retry * 1000);
610
633
  });
611
634
  }
@@ -2797,7 +2820,8 @@ class ExternalApp {
2797
2820
 
2798
2821
 
2799
2822
 
2800
-
2823
+
2824
+
2801
2825
 
2802
2826
 
2803
2827
  class Meeting {
@@ -2809,6 +2833,7 @@ class Meeting {
2809
2833
 
2810
2834
 
2811
2835
 
2836
+
2812
2837
 
2813
2838
 
2814
2839
  static parse(plain ) {
@@ -2820,14 +2845,28 @@ class Meeting {
2820
2845
  port: plain.port,
2821
2846
  uuid: plain.uuid,
2822
2847
  number: plain.number,
2848
+ persistent: plain.persistent,
2823
2849
  });
2824
2850
  }
2825
2851
 
2852
+ static parseMany(items ) {
2853
+ return items.map(plain => Meeting.parse(plain));
2854
+ }
2855
+
2826
2856
  static newFrom(meeting ) {
2827
2857
  return newFrom(meeting, Meeting);
2828
2858
  }
2829
2859
 
2830
- constructor({ uuid, name, guestSipAuthorization, ownerUuids, port, uri, number } = {}) {
2860
+ constructor({
2861
+ uuid,
2862
+ name,
2863
+ guestSipAuthorization,
2864
+ ownerUuids,
2865
+ port,
2866
+ uri,
2867
+ number,
2868
+ persistent,
2869
+ } = {}) {
2831
2870
  this.guestSipAuthorization = guestSipAuthorization;
2832
2871
  this.uri = uri;
2833
2872
  this.name = name;
@@ -2835,6 +2874,7 @@ class Meeting {
2835
2874
  this.port = port;
2836
2875
  this.uuid = uuid;
2837
2876
  this.number = number;
2877
+ this.persistent = persistent;
2838
2878
 
2839
2879
  // Useful to compare instead of instanceof with minified code
2840
2880
  this.type = 'Meeting';
@@ -2912,8 +2952,11 @@ var confdMethods = (client , baseUrl ) => ({
2912
2952
  }
2913
2953
  },
2914
2954
 
2915
- createMyMeeting: (name ) =>
2916
- client.post(`${baseUrl}/users/me/meetings`, { name }).then(Meeting.parse),
2955
+ getMyMeetings: () =>
2956
+ client.get(`${baseUrl}/users/me/meetings`).then(response => Meeting.parseMany(response.items)),
2957
+
2958
+ createMyMeeting: (name , persistent ) =>
2959
+ client.post(`${baseUrl}/users/me/meetings`, { name, persistent }).then(Meeting.parse),
2917
2960
 
2918
2961
  deleteMyMeeting: (meetingUuid ) =>
2919
2962
  client.delete(`${baseUrl}/users/me/meetings/${meetingUuid}`, null),
@@ -3015,7 +3058,7 @@ class ChatMessage {
3015
3058
  static parse(plain ) {
3016
3059
  return new ChatMessage({
3017
3060
  uuid: plain.uuid,
3018
- date: moment__default["default"](plain.created_at).toDate(),
3061
+ date: moment__default['default'](plain.created_at).toDate(),
3019
3062
  content: plain.content,
3020
3063
  alias: plain.alias,
3021
3064
  userUuid: plain.user_uuid,
@@ -3107,7 +3150,7 @@ class Voicemail {
3107
3150
  static parse(plain ) {
3108
3151
  return new Voicemail({
3109
3152
  id: plain.id,
3110
- date: moment__default["default"](plain.timestamp * 1000).toDate(),
3153
+ date: moment__default['default'](plain.timestamp * 1000).toDate(),
3111
3154
  duration: plain.duration * 1000,
3112
3155
  caller: {
3113
3156
  name: plain.caller_id_name,
@@ -3192,7 +3235,7 @@ class Recording {
3192
3235
 
3193
3236
 
3194
3237
 
3195
- static parseMany(recordings ) {
3238
+ static parseMany(recordings = []) {
3196
3239
  return recordings.map(item => Recording.parse(item));
3197
3240
  }
3198
3241
 
@@ -3200,8 +3243,8 @@ class Recording {
3200
3243
  return new Recording({
3201
3244
  deleted: plain.deleted,
3202
3245
  fileName: plain.filename,
3203
- end: plain.end_time ? moment__default["default"](plain.end_time).toDate() : null,
3204
- start: moment__default["default"](plain.start_time).toDate(),
3246
+ end: plain.end_time ? moment__default['default'](plain.end_time).toDate() : null,
3247
+ start: moment__default['default'](plain.start_time).toDate(),
3205
3248
  uuid: plain.uuid,
3206
3249
  });
3207
3250
  }
@@ -3299,7 +3342,7 @@ class CallLog {
3299
3342
 
3300
3343
  static parse(plain ) {
3301
3344
  return new CallLog({
3302
- answer: plain.answer ? moment__default["default"](plain.answer).toDate() : null,
3345
+ answer: plain.answer ? moment__default['default'](plain.answer).toDate() : null,
3303
3346
  answered: plain.answered,
3304
3347
  callDirection: plain.call_direction,
3305
3348
  destination: {
@@ -3316,9 +3359,9 @@ class CallLog {
3316
3359
  },
3317
3360
  id: plain.id,
3318
3361
  duration: (plain.duration || 0) * 1000, // duration is in seconds
3319
- start: moment__default["default"](plain.start).toDate(),
3320
- end: plain.end ? moment__default["default"](plain.end).toDate() : null,
3321
- recordings: Recording.parseMany(plain.recordings),
3362
+ start: moment__default['default'](plain.start).toDate(),
3363
+ end: plain.end ? moment__default['default'](plain.end).toDate() : null,
3364
+ recordings: Recording.parseMany(plain.recordings || []),
3322
3365
  });
3323
3366
  }
3324
3367
 
@@ -94,7 +94,7 @@ class Call {
94
94
  onHold: plain.on_hold,
95
95
  status: plain.status,
96
96
  lineId: plain.line_id,
97
- startingTime: moment__default["default"](plain.creation_time).toDate(),
97
+ startingTime: moment__default['default'](plain.creation_time).toDate(),
98
98
  talkingToIds: Object.keys(plain.talking_to || {}),
99
99
  recording: plain.record_state === RECORD_STATE_ACTIVE,
100
100
  });
@@ -59,7 +59,7 @@ class Recording {
59
59
 
60
60
 
61
61
 
62
- static parseMany(recordings ) {
62
+ static parseMany(recordings = []) {
63
63
  return recordings.map(item => Recording.parse(item));
64
64
  }
65
65
 
@@ -67,8 +67,8 @@ class Recording {
67
67
  return new Recording({
68
68
  deleted: plain.deleted,
69
69
  fileName: plain.filename,
70
- end: plain.end_time ? moment__default["default"](plain.end_time).toDate() : null,
71
- start: moment__default["default"](plain.start_time).toDate(),
70
+ end: plain.end_time ? moment__default['default'](plain.end_time).toDate() : null,
71
+ start: moment__default['default'](plain.start_time).toDate(),
72
72
  uuid: plain.uuid,
73
73
  });
74
74
  }
@@ -166,7 +166,7 @@ class CallLog {
166
166
 
167
167
  static parse(plain ) {
168
168
  return new CallLog({
169
- answer: plain.answer ? moment__default["default"](plain.answer).toDate() : null,
169
+ answer: plain.answer ? moment__default['default'](plain.answer).toDate() : null,
170
170
  answered: plain.answered,
171
171
  callDirection: plain.call_direction,
172
172
  destination: {
@@ -183,9 +183,9 @@ class CallLog {
183
183
  },
184
184
  id: plain.id,
185
185
  duration: (plain.duration || 0) * 1000, // duration is in seconds
186
- start: moment__default["default"](plain.start).toDate(),
187
- end: plain.end ? moment__default["default"](plain.end).toDate() : null,
188
- recordings: Recording.parseMany(plain.recordings),
186
+ start: moment__default['default'](plain.start).toDate(),
187
+ end: plain.end ? moment__default['default'](plain.end).toDate() : null,
188
+ recordings: Recording.parseMany(plain.recordings || []),
189
189
  });
190
190
  }
191
191
 
@@ -64,7 +64,7 @@ class ChatMessage {
64
64
  static parse(plain ) {
65
65
  return new ChatMessage({
66
66
  uuid: plain.uuid,
67
- date: moment__default["default"](plain.created_at).toDate(),
67
+ date: moment__default['default'](plain.created_at).toDate(),
68
68
  content: plain.content,
69
69
  alias: plain.alias,
70
70
  userUuid: plain.user_uuid,
@@ -745,4 +745,4 @@ class Contact {
745
745
  }
746
746
 
747
747
  exports.BACKEND = BACKEND;
748
- exports["default"] = Contact;
748
+ exports.default = Contact;