@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
@@ -122,7 +122,7 @@ class Call {
122
122
  onHold: plain.on_hold,
123
123
  status: plain.status,
124
124
  lineId: plain.line_id,
125
- startingTime: moment__default["default"](plain.creation_time).toDate(),
125
+ startingTime: moment__default['default'](plain.creation_time).toDate(),
126
126
  talkingToIds: Object.keys(plain.talking_to || {}),
127
127
  recording: plain.record_state === RECORD_STATE_ACTIVE,
128
128
  });
@@ -721,6 +721,7 @@ class IssueReporter {
721
721
 
722
722
 
723
723
 
724
+
724
725
 
725
726
  constructor() {
726
727
  addLevelsTo(this);
@@ -732,12 +733,17 @@ class IssueReporter {
732
733
  this.bufferTimeout = null;
733
734
  this._boundProcessBuffer = this._processBuffer.bind(this);
734
735
  this._boundParseLoggerBody = this._parseLoggerBody.bind(this);
736
+ this._callback = null;
735
737
  }
736
738
 
737
739
  init() {
738
740
  this._catchConsole();
739
741
  }
740
742
 
743
+ setCallback(cb ) {
744
+ this._callback = cb;
745
+ }
746
+
741
747
  configureRemoteClient(configuration = { tag: 'wazo-sdk', host: null, port: null, level: null, extra: {} }) {
742
748
  this.remoteClientConfiguration = configuration;
743
749
  }
@@ -773,6 +779,7 @@ class IssueReporter {
773
779
 
774
780
  // Handle category label
775
781
  let category = null;
782
+ let skipSendToRemote = false;
776
783
  let extra = {};
777
784
  if (args[0].indexOf(CATEGORY_PREFIX) === 0) {
778
785
  category = args[0].split('=')[1];
@@ -788,6 +795,7 @@ class IssueReporter {
788
795
  errorMessage: lastArg.message,
789
796
  errorStack: lastArg.stack,
790
797
  errorType: lastArg.constructor.name,
798
+ skipSendToRemote: lastArg.skipSendToRemote,
791
799
  };
792
800
  } else {
793
801
  extra = lastArg;
@@ -796,7 +804,12 @@ class IssueReporter {
796
804
  args.splice(1, 1);
797
805
  }
798
806
 
799
- const date = moment__default["default"]().format('YYYY-MM-DD HH:mm:ss.SSS');
807
+ if (extra.skipSendToRemote) {
808
+ skipSendToRemote = true;
809
+ delete extra.skipSendToRemote;
810
+ }
811
+
812
+ const date = moment__default['default']().format('YYYY-MM-DD HH:mm:ss.SSS');
800
813
  const message = args.join(', ');
801
814
  let consoleMessage = message;
802
815
 
@@ -816,7 +829,13 @@ class IssueReporter {
816
829
  const oldMethod = this.oldConsoleMethods[consoleLevel] || this.oldConsoleMethods.log;
817
830
  oldMethod.apply(oldMethod, [date, consoleMessage]);
818
831
 
819
- this._sendToRemoteLogger(level, { date, message, category, ...extra });
832
+ if (this._callback) {
833
+ this._callback(level, consoleMessage);
834
+ }
835
+
836
+ if (!skipSendToRemote) {
837
+ this._sendToRemoteLogger(level, { date, message, category, ...extra });
838
+ }
820
839
  }
821
840
 
822
841
  logRequest(url , options , response , start ) {
@@ -961,7 +980,11 @@ class IssueReporter {
961
980
  },
962
981
  // $FlowFixMe
963
982
  body,
964
- }).catch(() => {
983
+ }).catch((e ) => {
984
+ // $FlowFixMe
985
+ e.skipSendToRemote = true;
986
+ this.log('error', this._makeCategory('grafana'), 'Sending log to grafana, error', e);
987
+
965
988
  setTimeout(() => {
966
989
  if (isArray) {
967
990
  payload = payload.map(message => {
@@ -973,7 +996,7 @@ class IssueReporter {
973
996
  payload._retry = retry + 1;
974
997
  }
975
998
 
976
- this._sendDebugToGrafana(body, retry + 1);
999
+ this._sendDebugToGrafana(payload, retry + 1);
977
1000
  }, 5000 + retry * 1000);
978
1001
  });
979
1002
  }
@@ -3165,7 +3188,8 @@ class ExternalApp {
3165
3188
 
3166
3189
 
3167
3190
 
3168
-
3191
+
3192
+
3169
3193
 
3170
3194
 
3171
3195
  class Meeting {
@@ -3177,6 +3201,7 @@ class Meeting {
3177
3201
 
3178
3202
 
3179
3203
 
3204
+
3180
3205
 
3181
3206
 
3182
3207
  static parse(plain ) {
@@ -3188,14 +3213,28 @@ class Meeting {
3188
3213
  port: plain.port,
3189
3214
  uuid: plain.uuid,
3190
3215
  number: plain.number,
3216
+ persistent: plain.persistent,
3191
3217
  });
3192
3218
  }
3193
3219
 
3220
+ static parseMany(items ) {
3221
+ return items.map(plain => Meeting.parse(plain));
3222
+ }
3223
+
3194
3224
  static newFrom(meeting ) {
3195
3225
  return newFrom(meeting, Meeting);
3196
3226
  }
3197
3227
 
3198
- constructor({ uuid, name, guestSipAuthorization, ownerUuids, port, uri, number } = {}) {
3228
+ constructor({
3229
+ uuid,
3230
+ name,
3231
+ guestSipAuthorization,
3232
+ ownerUuids,
3233
+ port,
3234
+ uri,
3235
+ number,
3236
+ persistent,
3237
+ } = {}) {
3199
3238
  this.guestSipAuthorization = guestSipAuthorization;
3200
3239
  this.uri = uri;
3201
3240
  this.name = name;
@@ -3203,6 +3242,7 @@ class Meeting {
3203
3242
  this.port = port;
3204
3243
  this.uuid = uuid;
3205
3244
  this.number = number;
3245
+ this.persistent = persistent;
3206
3246
 
3207
3247
  // Useful to compare instead of instanceof with minified code
3208
3248
  this.type = 'Meeting';
@@ -3280,8 +3320,11 @@ var confdMethods = (client , baseUrl ) => ({
3280
3320
  }
3281
3321
  },
3282
3322
 
3283
- createMyMeeting: (name ) =>
3284
- client.post(`${baseUrl}/users/me/meetings`, { name }).then(Meeting.parse),
3323
+ getMyMeetings: () =>
3324
+ client.get(`${baseUrl}/users/me/meetings`).then(response => Meeting.parseMany(response.items)),
3325
+
3326
+ createMyMeeting: (name , persistent ) =>
3327
+ client.post(`${baseUrl}/users/me/meetings`, { name, persistent }).then(Meeting.parse),
3285
3328
 
3286
3329
  deleteMyMeeting: (meetingUuid ) =>
3287
3330
  client.delete(`${baseUrl}/users/me/meetings/${meetingUuid}`, null),
@@ -3383,7 +3426,7 @@ class ChatMessage {
3383
3426
  static parse(plain ) {
3384
3427
  return new ChatMessage({
3385
3428
  uuid: plain.uuid,
3386
- date: moment__default["default"](plain.created_at).toDate(),
3429
+ date: moment__default['default'](plain.created_at).toDate(),
3387
3430
  content: plain.content,
3388
3431
  alias: plain.alias,
3389
3432
  userUuid: plain.user_uuid,
@@ -3475,7 +3518,7 @@ class Voicemail {
3475
3518
  static parse(plain ) {
3476
3519
  return new Voicemail({
3477
3520
  id: plain.id,
3478
- date: moment__default["default"](plain.timestamp * 1000).toDate(),
3521
+ date: moment__default['default'](plain.timestamp * 1000).toDate(),
3479
3522
  duration: plain.duration * 1000,
3480
3523
  caller: {
3481
3524
  name: plain.caller_id_name,
@@ -3541,7 +3584,7 @@ class Emitter {
3541
3584
 
3542
3585
 
3543
3586
  constructor() {
3544
- this.eventEmitter = new EventEmitter__default["default"]();
3587
+ this.eventEmitter = new EventEmitter__default['default']();
3545
3588
  }
3546
3589
 
3547
3590
  on(event , callback ) {
@@ -3586,7 +3629,7 @@ class Recording {
3586
3629
 
3587
3630
 
3588
3631
 
3589
- static parseMany(recordings ) {
3632
+ static parseMany(recordings = []) {
3590
3633
  return recordings.map(item => Recording.parse(item));
3591
3634
  }
3592
3635
 
@@ -3594,8 +3637,8 @@ class Recording {
3594
3637
  return new Recording({
3595
3638
  deleted: plain.deleted,
3596
3639
  fileName: plain.filename,
3597
- end: plain.end_time ? moment__default["default"](plain.end_time).toDate() : null,
3598
- start: moment__default["default"](plain.start_time).toDate(),
3640
+ end: plain.end_time ? moment__default['default'](plain.end_time).toDate() : null,
3641
+ start: moment__default['default'](plain.start_time).toDate(),
3599
3642
  uuid: plain.uuid,
3600
3643
  });
3601
3644
  }
@@ -3693,7 +3736,7 @@ class CallLog {
3693
3736
 
3694
3737
  static parse(plain ) {
3695
3738
  return new CallLog({
3696
- answer: plain.answer ? moment__default["default"](plain.answer).toDate() : null,
3739
+ answer: plain.answer ? moment__default['default'](plain.answer).toDate() : null,
3697
3740
  answered: plain.answered,
3698
3741
  callDirection: plain.call_direction,
3699
3742
  destination: {
@@ -3710,9 +3753,9 @@ class CallLog {
3710
3753
  },
3711
3754
  id: plain.id,
3712
3755
  duration: (plain.duration || 0) * 1000, // duration is in seconds
3713
- start: moment__default["default"](plain.start).toDate(),
3714
- end: plain.end ? moment__default["default"](plain.end).toDate() : null,
3715
- recordings: Recording.parseMany(plain.recordings),
3756
+ start: moment__default['default'](plain.start).toDate(),
3757
+ end: plain.end ? moment__default['default'](plain.end).toDate() : null,
3758
+ recordings: Recording.parseMany(plain.recordings || []),
3716
3759
  });
3717
3760
  }
3718
3761
 
@@ -5622,7 +5665,7 @@ const parseCandidate$1 = (candidate ) => {
5622
5665
  if (!candidate) {
5623
5666
  return null;
5624
5667
  }
5625
- const result = sdpParser__default["default"].parse(candidate.indexOf('a=') === 0 ? candidate : `a=${candidate}`);
5668
+ const result = sdpParser__default['default'].parse(candidate.indexOf('a=') === 0 ? candidate : `a=${candidate}`);
5626
5669
 
5627
5670
  return result.candidates ? result.candidates[0] : null;
5628
5671
  };
@@ -5636,7 +5679,7 @@ const areCandidateValid = (candidates ) =>
5636
5679
  .length > 0;
5637
5680
 
5638
5681
  const getVideoDirection = (sdp ) => {
5639
- const parsedSdp = sdpParser__default["default"].parse(sdp);
5682
+ const parsedSdp = sdpParser__default['default'].parse(sdp);
5640
5683
  const videoMedia = parsedSdp.media.find(media => media.type === 'video');
5641
5684
  if (!videoMedia) {
5642
5685
  return null;
@@ -5650,14 +5693,14 @@ const hasAnActiveVideo = (sdp ) => {
5650
5693
  return false;
5651
5694
  }
5652
5695
 
5653
- const parsedSdp = sdpParser__default["default"].parse(sdp);
5696
+ const parsedSdp = sdpParser__default['default'].parse(sdp);
5654
5697
 
5655
5698
  return !!parsedSdp.media.find(media =>
5656
5699
  media.type === 'video' && media.port > 10 && (!media.direction || media.direction !== 'inactive'));
5657
5700
  };
5658
5701
 
5659
5702
  const fixSdp = (sdp , candidates , forcePort = true) => {
5660
- const parsedSdp = sdpParser__default["default"].parse(sdp);
5703
+ const parsedSdp = sdpParser__default['default'].parse(sdp);
5661
5704
  const mainCandidate = getSrflxOrRelay(candidates)[0];
5662
5705
  const ip = mainCandidate ? mainCandidate.ip : null;
5663
5706
 
@@ -5675,7 +5718,7 @@ const fixSdp = (sdp , candidates , forcePort = true)
5675
5718
  };
5676
5719
  });
5677
5720
 
5678
- let fixed = sdpParser__default["default"].write(parsedSdp);
5721
+ let fixed = sdpParser__default['default'].write(parsedSdp);
5679
5722
 
5680
5723
  if (ip) {
5681
5724
  fixed = fixed.replace(/IN IP4 0.0.0.0/g, `IN IP4 ${ip}`);
@@ -5721,7 +5764,7 @@ class WazoSessionDescriptionHandler extends sessionDescriptionHandler.SessionDes
5721
5764
  ) {
5722
5765
  super(logger, mediaStreamFactory, sessionDescriptionHandlerConfiguration);
5723
5766
 
5724
- this.eventEmitter = new EventEmitter__default["default"]();
5767
+ this.eventEmitter = new EventEmitter__default['default']();
5725
5768
  this.isWeb = isWeb;
5726
5769
  this.session = session;
5727
5770
  }
@@ -6702,7 +6745,9 @@ class WebRTCClient extends Emitter {
6702
6745
  const inviteOptions = {
6703
6746
  requestDelegate: {
6704
6747
  onAccept: (response ) => {
6705
- session.sessionDescriptionHandler.peerConnection.sfu = conference;
6748
+ if (session.sessionDescriptionHandler.peerConnection) {
6749
+ session.sessionDescriptionHandler.peerConnection.sfu = conference;
6750
+ }
6706
6751
  this._onAccepted(session, response.session, true);
6707
6752
  },
6708
6753
  onReject: (response ) => {
@@ -7038,7 +7083,7 @@ class WebRTCClient extends Emitter {
7038
7083
  // We search for the last transceiver without `video-` in the mid (video- means remote transceiver)
7039
7084
  const transceivers = pc.getTransceivers();
7040
7085
  const transceiverIdx = lastIndexOf(transceivers, transceiver =>
7041
- transceiver.sender.track === null && transceiver.mid.indexOf('video') === -1);
7086
+ transceiver.sender.track === null && transceiver.mid && transceiver.mid.indexOf('video') === -1);
7042
7087
 
7043
7088
  videoSender = transceiverIdx !== -1 ? transceivers[transceiverIdx].sender : null;
7044
7089
  } else {
@@ -7574,6 +7619,16 @@ class WebRTCClient extends Emitter {
7574
7619
  return this.hasRemoteVideo(sessionId) ? this.getRemoteStream(sessionId) : null;
7575
7620
  }
7576
7621
 
7622
+ // Useful in a react-native environment when remoteMediaStream is not updated
7623
+ getRemoteVideoStreamFromPc(sessionId ) {
7624
+ const pc = this.getPeerConnection(sessionId);
7625
+ if (!pc) {
7626
+ return null;
7627
+ }
7628
+
7629
+ return pc.getRemoteStreams().find(stream => !!stream.getVideoTracks().length);
7630
+ }
7631
+
7577
7632
  hasVideo(sessionId ) {
7578
7633
  return this.hasLocalVideo(sessionId) || this.hasRemoteVideo(sessionId);
7579
7634
  }
@@ -8084,6 +8139,7 @@ class WebRTCClient extends Emitter {
8084
8139
  session.sessionDescriptionHandler.remoteMediaStream.onaddtrack = onTrack;
8085
8140
 
8086
8141
  pc.oniceconnectionstatechange = () => {
8142
+ logger$9.info('on ice connection state changed', { state: pc.iceConnectionState });
8087
8143
  if (pc.iceConnectionState === 'disconnected') {
8088
8144
  this.eventEmitter.emit(ON_DISCONNECTED$1);
8089
8145
  }
@@ -8243,7 +8299,7 @@ class WebRTCClient extends Emitter {
8243
8299
  }
8244
8300
  const sessionId = this.getSipSessionId(session);
8245
8301
 
8246
- getStats__default["default"](pc, (result ) => {
8302
+ getStats__default['default'](pc, (result ) => {
8247
8303
  const { results, internal, nomore, ...stats } = result;
8248
8304
  this.statsIntervals[sessionId] = nomore;
8249
8305
 
@@ -8352,18 +8408,22 @@ class WebRTCClient extends Emitter {
8352
8408
  });
8353
8409
 
8354
8410
  networkStats.packetsLost = packetsLost;
8355
- networkStats.audioBytesSent = audioBytesSent;
8411
+ networkStats.totalAudioBytesSent = audioBytesSent;
8412
+ networkStats.audioBytesSent = audioBytesSent - lastAudioSent;
8413
+ networkStats.totalAudioBytesReceived = audioBytesReceived - lastAudioReceived;
8356
8414
  networkStats.audioBytesReceived = audioBytesReceived;
8357
- networkStats.videoBytesSent = videoBytesSent;
8358
- networkStats.videoBytesReceived = videoBytesReceived;
8415
+ networkStats.totalVideoBytesSent = videoBytesSent;
8416
+ networkStats.videoBytesSent = videoBytesSent - lastVideoSent;
8417
+ networkStats.totalVideoBytesReceived = videoBytesReceived;
8418
+ networkStats.videoBytesReceived = videoBytesReceived - lastVideoReceived;
8419
+ networkStats.totalTransportSent = transportSent - lastTransportSent;
8359
8420
  networkStats.transportSent = transportSent;
8360
- networkStats.transportReceived = transportReceived;
8361
-
8362
- const bandwidth = (networkStats.audioBytesSent - lastAudioSent) + (networkStats.videoBytesSent - lastVideoSent)
8363
- + (networkStats.audioBytesReceived - lastAudioReceived) + (networkStats.videoBytesReceived - lastVideoReceived)
8364
- + (networkStats.transportReceived - lastTransportReceived) + (networkStats.transportSent - lastTransportSent);
8421
+ networkStats.totalTransportReceived = transportReceived;
8422
+ networkStats.transportReceived = transportReceived - lastTransportReceived;
8365
8423
 
8366
- networkStats.bandwidth = bandwidth;
8424
+ networkStats.bandwidth = networkStats.audioBytesSent + networkStats.audioBytesReceived
8425
+ + networkStats.videoBytesSent + networkStats.videoBytesReceived + networkStats.transportReceived
8426
+ + networkStats.transportSent;
8367
8427
 
8368
8428
  this.eventEmitter.emit(ON_NETWORK_STATS$1, session, networkStats, this.sessionNetworkStats[sessionId]);
8369
8429
  this.sessionNetworkStats[sessionId].push(networkStats);
@@ -8745,7 +8805,10 @@ class WebRTCPhone extends Emitter {
8745
8805
 
8746
8806
  onCancel(message);
8747
8807
  const elsewhere = message.data.indexOf('cause=26') !== -1 && message.data.indexOf('completed elsewhere') !== -1;
8748
- this.eventEmitter.emit(ON_CALL_CANCELED, this._createCallSession(sipSession), elsewhere);
8808
+ const callSession = this._createCallSession(sipSession);
8809
+ delete this.callSessions[callSession.getId()];
8810
+
8811
+ this.eventEmitter.emit(ON_CALL_CANCELED, callSession, elsewhere);
8749
8812
  };
8750
8813
  } else if (sipSession instanceof invitation.Invitation) {
8751
8814
  console.warn('sipSession._onCancel not found, please update the wazo SDK accordingly');
@@ -8774,9 +8837,11 @@ class WebRTCPhone extends Emitter {
8774
8837
  case sessionState.SessionState.Terminated: {
8775
8838
  logger$8.info('WebRTC phone - call terminated', { sipId: sipSession.id });
8776
8839
 
8840
+ // Should be called before `_onCallTerminated` or the callCount will not decrement...
8841
+ const callSession = this._createCallSession(sipSession);
8777
8842
  const wasCurrentSession = this._onCallTerminated(sipSession);
8778
8843
 
8779
- return this.eventEmitter.emit(ON_CALL_ENDED, this._createCallSession(sipSession), wasCurrentSession);
8844
+ return this.eventEmitter.emit(ON_CALL_ENDED, callSession, wasCurrentSession);
8780
8845
  }
8781
8846
  }
8782
8847
  });
@@ -9724,6 +9789,10 @@ class WebRTCPhone extends Emitter {
9724
9789
  return callSession ? this.client.getRemoteVideoStream(callSession.sipCallId) : null;
9725
9790
  }
9726
9791
 
9792
+ getRemoteVideoStreamFromPc(callSession ) {
9793
+ return callSession ? this.client.getRemoteVideoStreamFromPc(callSession.sipCallId) : null;
9794
+ }
9795
+
9727
9796
  hasRemoteVideo(callSession ) {
9728
9797
  return callSession ? this.client.hasRemoteVideo(callSession.sipCallId) : false;
9729
9798
  }
@@ -10425,6 +10494,7 @@ const AGENT_PAUSED = 'agent_paused';
10425
10494
  const AGENT_UNPAUSED = 'agent_unpaused';
10426
10495
  const CONFERENCE_ADHOC_PARTICIPANT_LEFT = 'conference_adhoc_participant_left';
10427
10496
  const CONFERENCE_ADHOC_DELETED = 'conference_adhoc_deleted';
10497
+ const MEETING_USER_PROGRESS = 'meeting_user_progress';
10428
10498
 
10429
10499
  const BLACKLIST_EVENTS = [
10430
10500
  CHAT_MESSAGE_SENT,
@@ -10484,7 +10554,7 @@ class WebSocketClient extends Emitter {
10484
10554
 
10485
10555
  connect() {
10486
10556
  logger$6.info('connect method started', { host: this.host, token: this.token });
10487
- this.socket = new ReconnectingWebSocket__default["default"](this._getUrl.bind(this), [], this.options);
10557
+ this.socket = new ReconnectingWebSocket__default['default'](this._getUrl.bind(this), [], this.options);
10488
10558
  if (this.options.binaryType) {
10489
10559
  this.socket.binaryType = this.options.binaryType;
10490
10560
  }
@@ -10775,6 +10845,7 @@ WebSocketClient.eventLists = [
10775
10845
  AGENT_UNPAUSED,
10776
10846
  CONFERENCE_ADHOC_PARTICIPANT_LEFT,
10777
10847
  CONFERENCE_ADHOC_DELETED,
10848
+ MEETING_USER_PROGRESS,
10778
10849
  ];
10779
10850
 
10780
10851
  var WebSocketClient$1 = /*#__PURE__*/Object.freeze({
@@ -10845,6 +10916,7 @@ var WebSocketClient$1 = /*#__PURE__*/Object.freeze({
10845
10916
  AGENT_UNPAUSED: AGENT_UNPAUSED,
10846
10917
  CONFERENCE_ADHOC_PARTICIPANT_LEFT: CONFERENCE_ADHOC_PARTICIPANT_LEFT,
10847
10918
  CONFERENCE_ADHOC_DELETED: CONFERENCE_ADHOC_DELETED,
10919
+ MEETING_USER_PROGRESS: MEETING_USER_PROGRESS,
10848
10920
  HEARTBEAT_ENGINE_VERSION: HEARTBEAT_ENGINE_VERSION,
10849
10921
  'default': WebSocketClient
10850
10922
  });
@@ -11737,7 +11809,7 @@ class Room$1 extends Emitter {
11737
11809
  }
11738
11810
 
11739
11811
  _mapMsid(rawSdp ) {
11740
- const sdp = sdpParser__default["default"].parse(rawSdp);
11812
+ const sdp = sdpParser__default['default'].parse(rawSdp);
11741
11813
  const labelMsidArray = sdp.media.filter(media => !!media.label).map(({ label, msid }) => ({
11742
11814
  label: String(label),
11743
11815
  streamId: msid.split(' ')[0],
@@ -13564,6 +13636,11 @@ class Phone extends Emitter {
13564
13636
  return this.getRemoteVideoStream(callSession);
13565
13637
  }
13566
13638
 
13639
+ // Useful in a react-native environment when remoteMediaStream is not updated
13640
+ getRemoteVideoStreamFromPc(callSession ) {
13641
+ return this.phone ? this.phone.getRemoteVideoStreamFromPc(callSession) : false;
13642
+ }
13643
+
13567
13644
  hasVideo(callSession ) {
13568
13645
  return this.phone ? this.phone.hasVideo(callSession) : false;
13569
13646
  }
@@ -17,7 +17,7 @@ class Emitter {
17
17
 
18
18
 
19
19
  constructor() {
20
- this.eventEmitter = new EventEmitter__default["default"]();
20
+ this.eventEmitter = new EventEmitter__default['default']();
21
21
  }
22
22
 
23
23
  on(event , callback ) {
@@ -129,6 +129,7 @@ class IssueReporter {
129
129
 
130
130
 
131
131
 
132
+
132
133
 
133
134
  constructor() {
134
135
  addLevelsTo(this);
@@ -140,12 +141,17 @@ class IssueReporter {
140
141
  this.bufferTimeout = null;
141
142
  this._boundProcessBuffer = this._processBuffer.bind(this);
142
143
  this._boundParseLoggerBody = this._parseLoggerBody.bind(this);
144
+ this._callback = null;
143
145
  }
144
146
 
145
147
  init() {
146
148
  this._catchConsole();
147
149
  }
148
150
 
151
+ setCallback(cb ) {
152
+ this._callback = cb;
153
+ }
154
+
149
155
  configureRemoteClient(configuration = { tag: 'wazo-sdk', host: null, port: null, level: null, extra: {} }) {
150
156
  this.remoteClientConfiguration = configuration;
151
157
  }
@@ -181,6 +187,7 @@ class IssueReporter {
181
187
 
182
188
  // Handle category label
183
189
  let category = null;
190
+ let skipSendToRemote = false;
184
191
  let extra = {};
185
192
  if (args[0].indexOf(CATEGORY_PREFIX) === 0) {
186
193
  category = args[0].split('=')[1];
@@ -196,6 +203,7 @@ class IssueReporter {
196
203
  errorMessage: lastArg.message,
197
204
  errorStack: lastArg.stack,
198
205
  errorType: lastArg.constructor.name,
206
+ skipSendToRemote: lastArg.skipSendToRemote,
199
207
  };
200
208
  } else {
201
209
  extra = lastArg;
@@ -204,7 +212,12 @@ class IssueReporter {
204
212
  args.splice(1, 1);
205
213
  }
206
214
 
207
- const date = moment__default["default"]().format('YYYY-MM-DD HH:mm:ss.SSS');
215
+ if (extra.skipSendToRemote) {
216
+ skipSendToRemote = true;
217
+ delete extra.skipSendToRemote;
218
+ }
219
+
220
+ const date = moment__default['default']().format('YYYY-MM-DD HH:mm:ss.SSS');
208
221
  const message = args.join(', ');
209
222
  let consoleMessage = message;
210
223
 
@@ -224,7 +237,13 @@ class IssueReporter {
224
237
  const oldMethod = this.oldConsoleMethods[consoleLevel] || this.oldConsoleMethods.log;
225
238
  oldMethod.apply(oldMethod, [date, consoleMessage]);
226
239
 
227
- this._sendToRemoteLogger(level, { date, message, category, ...extra });
240
+ if (this._callback) {
241
+ this._callback(level, consoleMessage);
242
+ }
243
+
244
+ if (!skipSendToRemote) {
245
+ this._sendToRemoteLogger(level, { date, message, category, ...extra });
246
+ }
228
247
  }
229
248
 
230
249
  logRequest(url , options , response , start ) {
@@ -369,7 +388,11 @@ class IssueReporter {
369
388
  },
370
389
  // $FlowFixMe
371
390
  body,
372
- }).catch(() => {
391
+ }).catch((e ) => {
392
+ // $FlowFixMe
393
+ e.skipSendToRemote = true;
394
+ this.log('error', this._makeCategory('grafana'), 'Sending log to grafana, error', e);
395
+
373
396
  setTimeout(() => {
374
397
  if (isArray) {
375
398
  payload = payload.map(message => {
@@ -381,7 +404,7 @@ class IssueReporter {
381
404
  payload._retry = retry + 1;
382
405
  }
383
406
 
384
- this._sendDebugToGrafana(body, retry + 1);
407
+ this._sendDebugToGrafana(payload, retry + 1);
385
408
  }, 5000 + retry * 1000);
386
409
  });
387
410
  }
@@ -586,6 +609,7 @@ const AGENT_PAUSED = 'agent_paused';
586
609
  const AGENT_UNPAUSED = 'agent_unpaused';
587
610
  const CONFERENCE_ADHOC_PARTICIPANT_LEFT = 'conference_adhoc_participant_left';
588
611
  const CONFERENCE_ADHOC_DELETED = 'conference_adhoc_deleted';
612
+ const MEETING_USER_PROGRESS = 'meeting_user_progress';
589
613
 
590
614
  const BLACKLIST_EVENTS = [
591
615
  CHAT_MESSAGE_SENT,
@@ -645,7 +669,7 @@ class WebSocketClient extends Emitter {
645
669
 
646
670
  connect() {
647
671
  logger$1.info('connect method started', { host: this.host, token: this.token });
648
- this.socket = new ReconnectingWebSocket__default["default"](this._getUrl.bind(this), [], this.options);
672
+ this.socket = new ReconnectingWebSocket__default['default'](this._getUrl.bind(this), [], this.options);
649
673
  if (this.options.binaryType) {
650
674
  this.socket.binaryType = this.options.binaryType;
651
675
  }
@@ -936,6 +960,7 @@ WebSocketClient.eventLists = [
936
960
  AGENT_UNPAUSED,
937
961
  CONFERENCE_ADHOC_PARTICIPANT_LEFT,
938
962
  CONFERENCE_ADHOC_DELETED,
963
+ MEETING_USER_PROGRESS,
939
964
  ];
940
965
 
941
966
  var WebSocketClient$1 = /*#__PURE__*/Object.freeze({
@@ -1006,6 +1031,7 @@ var WebSocketClient$1 = /*#__PURE__*/Object.freeze({
1006
1031
  AGENT_UNPAUSED: AGENT_UNPAUSED,
1007
1032
  CONFERENCE_ADHOC_PARTICIPANT_LEFT: CONFERENCE_ADHOC_PARTICIPANT_LEFT,
1008
1033
  CONFERENCE_ADHOC_DELETED: CONFERENCE_ADHOC_DELETED,
1034
+ MEETING_USER_PROGRESS: MEETING_USER_PROGRESS,
1009
1035
  HEARTBEAT_ENGINE_VERSION: HEARTBEAT_ENGINE_VERSION,
1010
1036
  'default': WebSocketClient
1011
1037
  });