@wazo/sdk 0.37.17 → 0.37.21

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 (118) hide show
  1. package/dist/wazo-sdk.js +3 -3
  2. package/esm/__tests__/api-client.test.js +52 -9
  3. package/esm/__tests__/web-rtc-client.test.js +96 -21
  4. package/esm/api/agentd.js +26 -3
  5. package/esm/api/amid.js +26 -3
  6. package/esm/api/application.js +26 -3
  7. package/esm/api/auth.js +26 -3
  8. package/esm/api/call-logd.js +28 -5
  9. package/esm/api/calld.js +26 -3
  10. package/esm/api/chatd.js +26 -3
  11. package/esm/api/confd.js +50 -7
  12. package/esm/api/ctid-ng.js +26 -3
  13. package/esm/api/dird.js +26 -3
  14. package/esm/api/webhookd.js +26 -3
  15. package/esm/api-client.js +52 -9
  16. package/esm/checker/Checker.js +98 -21
  17. package/esm/checker/checks/aor.js +52 -9
  18. package/esm/checker/checks/api.js +52 -9
  19. package/esm/checker/checks/index.js +98 -21
  20. package/esm/checker/checks/wazo-websocket.js +28 -3
  21. package/esm/checker/checks/webrtc-transport.js +96 -21
  22. package/esm/checker/checks/webrtc.js +96 -21
  23. package/esm/domain/AdHocAPIConference.js +52 -9
  24. package/esm/domain/CallLog.js +2 -2
  25. package/esm/domain/Features.js +52 -9
  26. package/esm/domain/Meeting.js +19 -2
  27. package/esm/domain/Phone/CTIPhone.js +52 -9
  28. package/esm/domain/Phone/WebRTCPhone.js +41 -5
  29. package/esm/domain/Recording.js +1 -1
  30. package/esm/domain/__tests__/CallLog.test.js +2 -2
  31. package/esm/index.js +119 -22
  32. package/esm/lib/WazoSessionDescriptionHandler.js +26 -3
  33. package/esm/service/CallApi.js +52 -9
  34. package/esm/service/IssueReporter.js +26 -3
  35. package/esm/service/__tests__/IssueReporter.test.js +26 -3
  36. package/esm/service/getApiClient.js +52 -9
  37. package/esm/simple/Auth.js +119 -22
  38. package/esm/simple/Configuration.js +119 -22
  39. package/esm/simple/Directory.js +52 -9
  40. package/esm/simple/Phone.js +119 -22
  41. package/esm/simple/Websocket.js +29 -3
  42. package/esm/simple/index.js +119 -22
  43. package/esm/simple/room/LocalParticipant.js +119 -22
  44. package/esm/simple/room/Participant.js +119 -22
  45. package/esm/simple/room/RemoteParticipant.js +119 -22
  46. package/esm/simple/room/Room.js +119 -22
  47. package/esm/simple/room/SipRoom.js +119 -22
  48. package/esm/simple/room/Stream.js +119 -22
  49. package/esm/simple/room/__tests__/RemoteParticipant.test.js +119 -22
  50. package/esm/simple/utils.js +119 -22
  51. package/esm/utils/__tests__/api-requester.test.js +26 -3
  52. package/esm/utils/api-requester.js +26 -3
  53. package/esm/web-rtc-client.js +96 -21
  54. package/esm/websocket-client.js +29 -4
  55. package/lib/__tests__/api-client.test.js +52 -9
  56. package/lib/__tests__/web-rtc-client.test.js +96 -21
  57. package/lib/api/agentd.js +26 -3
  58. package/lib/api/amid.js +26 -3
  59. package/lib/api/application.js +26 -3
  60. package/lib/api/auth.js +26 -3
  61. package/lib/api/call-logd.js +28 -5
  62. package/lib/api/calld.js +26 -3
  63. package/lib/api/chatd.js +26 -3
  64. package/lib/api/confd.js +50 -7
  65. package/lib/api/ctid-ng.js +26 -3
  66. package/lib/api/dird.js +26 -3
  67. package/lib/api/webhookd.js +26 -3
  68. package/lib/api-client.js +52 -9
  69. package/lib/checker/Checker.js +98 -21
  70. package/lib/checker/checks/aor.js +52 -9
  71. package/lib/checker/checks/api.js +52 -9
  72. package/lib/checker/checks/index.js +98 -21
  73. package/lib/checker/checks/wazo-websocket.js +28 -3
  74. package/lib/checker/checks/webrtc-transport.js +96 -21
  75. package/lib/checker/checks/webrtc.js +96 -21
  76. package/lib/domain/AdHocAPIConference.js +52 -9
  77. package/lib/domain/CallLog.js +2 -2
  78. package/lib/domain/Features.js +52 -9
  79. package/lib/domain/Meeting.js +19 -2
  80. package/lib/domain/Phone/CTIPhone.js +52 -9
  81. package/lib/domain/Phone/WebRTCPhone.js +41 -4
  82. package/lib/domain/Recording.js +1 -1
  83. package/lib/domain/__tests__/CallLog.test.js +2 -2
  84. package/lib/index.js +119 -22
  85. package/lib/lib/WazoSessionDescriptionHandler.js +26 -3
  86. package/lib/service/CallApi.js +52 -9
  87. package/lib/service/IssueReporter.js +26 -3
  88. package/lib/service/__tests__/IssueReporter.test.js +26 -3
  89. package/lib/service/getApiClient.js +52 -9
  90. package/lib/simple/Auth.js +119 -22
  91. package/lib/simple/Configuration.js +119 -22
  92. package/lib/simple/Directory.js +52 -9
  93. package/lib/simple/Phone.js +119 -22
  94. package/lib/simple/Websocket.js +29 -3
  95. package/lib/simple/index.js +119 -22
  96. package/lib/simple/room/LocalParticipant.js +119 -22
  97. package/lib/simple/room/Participant.js +119 -22
  98. package/lib/simple/room/RemoteParticipant.js +119 -22
  99. package/lib/simple/room/Room.js +119 -22
  100. package/lib/simple/room/SipRoom.js +119 -22
  101. package/lib/simple/room/Stream.js +119 -22
  102. package/lib/simple/room/__tests__/RemoteParticipant.test.js +119 -22
  103. package/lib/simple/utils.js +119 -22
  104. package/lib/utils/__tests__/api-requester.test.js +26 -3
  105. package/lib/utils/api-requester.js +26 -3
  106. package/lib/web-rtc-client.js +96 -21
  107. package/lib/websocket-client.js +29 -3
  108. package/package.json +2 -2
  109. package/src/api/confd.js +5 -2
  110. package/src/domain/CallLog.js +1 -1
  111. package/src/domain/Meeting.js +19 -2
  112. package/src/domain/Phone/WebRTCPhone.js +14 -1
  113. package/src/domain/Recording.js +1 -1
  114. package/src/service/IssueReporter.js +26 -3
  115. package/src/simple/Phone.js +5 -0
  116. package/src/types/WebSocketMessage.js +5 -1
  117. package/src/web-rtc-client.js +44 -12
  118. package/src/websocket-client.js +2 -0
@@ -421,6 +421,7 @@ class IssueReporter {
421
421
 
422
422
 
423
423
 
424
+
424
425
 
425
426
  constructor() {
426
427
  addLevelsTo(this);
@@ -432,12 +433,17 @@ class IssueReporter {
432
433
  this.bufferTimeout = null;
433
434
  this._boundProcessBuffer = this._processBuffer.bind(this);
434
435
  this._boundParseLoggerBody = this._parseLoggerBody.bind(this);
436
+ this._callback = null;
435
437
  }
436
438
 
437
439
  init() {
438
440
  this._catchConsole();
439
441
  }
440
442
 
443
+ setCallback(cb ) {
444
+ this._callback = cb;
445
+ }
446
+
441
447
  configureRemoteClient(configuration = { tag: 'wazo-sdk', host: null, port: null, level: null, extra: {} }) {
442
448
  this.remoteClientConfiguration = configuration;
443
449
  }
@@ -473,6 +479,7 @@ class IssueReporter {
473
479
 
474
480
  // Handle category label
475
481
  let category = null;
482
+ let skipSendToRemote = false;
476
483
  let extra = {};
477
484
  if (args[0].indexOf(CATEGORY_PREFIX) === 0) {
478
485
  category = args[0].split('=')[1];
@@ -488,6 +495,7 @@ class IssueReporter {
488
495
  errorMessage: lastArg.message,
489
496
  errorStack: lastArg.stack,
490
497
  errorType: lastArg.constructor.name,
498
+ skipSendToRemote: lastArg.skipSendToRemote,
491
499
  };
492
500
  } else {
493
501
  extra = lastArg;
@@ -496,6 +504,11 @@ class IssueReporter {
496
504
  args.splice(1, 1);
497
505
  }
498
506
 
507
+ if (extra.skipSendToRemote) {
508
+ skipSendToRemote = true;
509
+ delete extra.skipSendToRemote;
510
+ }
511
+
499
512
  const date = moment__default['default']().format('YYYY-MM-DD HH:mm:ss.SSS');
500
513
  const message = args.join(', ');
501
514
  let consoleMessage = message;
@@ -516,7 +529,13 @@ class IssueReporter {
516
529
  const oldMethod = this.oldConsoleMethods[consoleLevel] || this.oldConsoleMethods.log;
517
530
  oldMethod.apply(oldMethod, [date, consoleMessage]);
518
531
 
519
- this._sendToRemoteLogger(level, { date, message, category, ...extra });
532
+ if (this._callback) {
533
+ this._callback(level, consoleMessage);
534
+ }
535
+
536
+ if (!skipSendToRemote) {
537
+ this._sendToRemoteLogger(level, { date, message, category, ...extra });
538
+ }
520
539
  }
521
540
 
522
541
  logRequest(url , options , response , start ) {
@@ -661,7 +680,11 @@ class IssueReporter {
661
680
  },
662
681
  // $FlowFixMe
663
682
  body,
664
- }).catch(() => {
683
+ }).catch((e ) => {
684
+ // $FlowFixMe
685
+ e.skipSendToRemote = true;
686
+ this.log('error', this._makeCategory('grafana'), 'Sending log to grafana, error', e);
687
+
665
688
  setTimeout(() => {
666
689
  if (isArray) {
667
690
  payload = payload.map(message => {
@@ -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
  }
@@ -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),
@@ -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
 
@@ -3902,7 +3945,7 @@ class CallLog {
3902
3945
  duration: (plain.duration || 0) * 1000, // duration is in seconds
3903
3946
  start: moment__default['default'](plain.start).toDate(),
3904
3947
  end: plain.end ? moment__default['default'](plain.end).toDate() : null,
3905
- recordings: Recording.parseMany(plain.recordings),
3948
+ recordings: Recording.parseMany(plain.recordings || []),
3906
3949
  });
3907
3950
  }
3908
3951
 
@@ -5297,6 +5340,7 @@ const ON_REINVITE = 'reinvite';
5297
5340
  const ON_ERROR = 'onError';
5298
5341
  const ON_SCREEN_SHARING_REINVITE = 'onScreenSharingReinvite';
5299
5342
  const ON_NETWORK_STATS = 'onNetworkStats';
5343
+ const ON_DISCONNECTED = 'onDisconnected';
5300
5344
  class CanceledCallError extends Error {}
5301
5345
 
5302
5346
  const MAX_REGISTER_TRIES = 10;
@@ -5370,6 +5414,7 @@ class WebRTCClient extends Emitter {
5370
5414
 
5371
5415
 
5372
5416
 
5417
+
5373
5418
 
5374
5419
  static isAPrivateIp(ip ) {
5375
5420
  const regex = /^(?:10|127|172\.(?:1[6-9]|2[0-9]|3[01])|192\.168)\..*/;
@@ -5435,6 +5480,7 @@ class WebRTCClient extends Emitter {
5435
5480
  this.ON_ERROR = ON_ERROR;
5436
5481
  this.ON_SCREEN_SHARING_REINVITE = ON_SCREEN_SHARING_REINVITE;
5437
5482
  this.ON_NETWORK_STATS = ON_NETWORK_STATS;
5483
+ this.ON_DISCONNECTED = ON_DISCONNECTED;
5438
5484
  }
5439
5485
 
5440
5486
  configureMedia(media ) {
@@ -5700,7 +5746,9 @@ class WebRTCClient extends Emitter {
5700
5746
  const inviteOptions = {
5701
5747
  requestDelegate: {
5702
5748
  onAccept: (response ) => {
5703
- session.sessionDescriptionHandler.peerConnection.sfu = conference;
5749
+ if (session.sessionDescriptionHandler.peerConnection) {
5750
+ session.sessionDescriptionHandler.peerConnection.sfu = conference;
5751
+ }
5704
5752
  this._onAccepted(session, response.session, true);
5705
5753
  },
5706
5754
  onReject: (response ) => {
@@ -6036,7 +6084,7 @@ class WebRTCClient extends Emitter {
6036
6084
  // We search for the last transceiver without `video-` in the mid (video- means remote transceiver)
6037
6085
  const transceivers = pc.getTransceivers();
6038
6086
  const transceiverIdx = lastIndexOf(transceivers, transceiver =>
6039
- transceiver.sender.track === null && transceiver.mid.indexOf('video') === -1);
6087
+ transceiver.sender.track === null && transceiver.mid && transceiver.mid.indexOf('video') === -1);
6040
6088
 
6041
6089
  videoSender = transceiverIdx !== -1 ? transceivers[transceiverIdx].sender : null;
6042
6090
  } else {
@@ -6572,6 +6620,16 @@ class WebRTCClient extends Emitter {
6572
6620
  return this.hasRemoteVideo(sessionId) ? this.getRemoteStream(sessionId) : null;
6573
6621
  }
6574
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
+
6575
6633
  hasVideo(sessionId ) {
6576
6634
  return this.hasLocalVideo(sessionId) || this.hasRemoteVideo(sessionId);
6577
6635
  }
@@ -7061,6 +7119,7 @@ class WebRTCClient extends Emitter {
7061
7119
 
7062
7120
  this.updateRemoteStream(this.getSipSessionId(session));
7063
7121
 
7122
+ const pc = session.sessionDescriptionHandler.peerConnection;
7064
7123
  const onTrack = (event ) => {
7065
7124
  const isAudioOnly = this._isAudioOnly(session);
7066
7125
  const { kind, label, readyState, id, muted } = event.track;
@@ -7080,6 +7139,12 @@ class WebRTCClient extends Emitter {
7080
7139
 
7081
7140
  session.sessionDescriptionHandler.remoteMediaStream.onaddtrack = onTrack;
7082
7141
 
7142
+ pc.oniceconnectionstatechange = () => {
7143
+ if (pc.iceConnectionState === 'disconnected') {
7144
+ this.eventEmitter.emit(ON_DISCONNECTED);
7145
+ }
7146
+ };
7147
+
7083
7148
  if (withEvent) {
7084
7149
  this.eventEmitter.emit(ACCEPTED, session, sessionDialog);
7085
7150
  }
@@ -7299,6 +7364,7 @@ class WebRTCClient extends Emitter {
7299
7364
  let videoBytesReceived = 0;
7300
7365
  let transportSent = 0;
7301
7366
  let transportReceived = 0;
7367
+ let packetsLost = 0;
7302
7368
 
7303
7369
  stats.forEach(report => {
7304
7370
  if (report.type === 'outbound-rtp' && report.kind === 'audio') {
@@ -7311,7 +7377,7 @@ class WebRTCClient extends Emitter {
7311
7377
  videoBytesSent += report.bytesSent + report.headerBytesSent;
7312
7378
  }
7313
7379
  if (report.type === 'inbound-rtp' && report.kind === 'audio') {
7314
- networkStats.packetsLost = report.packetsLost;
7380
+ packetsLost += report.packetsLost;
7315
7381
  networkStats.packetsReceived = report.packetsReceived;
7316
7382
  audioBytesReceived += report.bytesReceived + report.headerBytesReceived;
7317
7383
  }
@@ -7328,27 +7394,36 @@ class WebRTCClient extends Emitter {
7328
7394
  }
7329
7395
  }
7330
7396
  if (report.type === 'remote-inbound-rtp' && report.kind === 'audio') {
7397
+ packetsLost += report.packetsLost;
7331
7398
  networkStats.roundTripTime = report.roundTripTime;
7332
7399
  networkStats.jitter = report.jitter;
7333
7400
  }
7401
+ if (report.type === 'remote-inbound-rtp' && report.kind === 'video') {
7402
+ packetsLost += report.packetsLost;
7403
+ }
7334
7404
  if (report.type === 'transport') {
7335
7405
  transportSent += report.bytesSent;
7336
7406
  transportReceived += report.bytesReceived;
7337
7407
  }
7338
7408
  });
7339
7409
 
7340
- networkStats.audioBytesSent = audioBytesSent;
7410
+ networkStats.packetsLost = packetsLost;
7411
+ networkStats.totalAudioBytesSent = audioBytesSent;
7412
+ networkStats.audioBytesSent = audioBytesSent - lastAudioSent;
7413
+ networkStats.totalAudioBytesReceived = audioBytesReceived - lastAudioReceived;
7341
7414
  networkStats.audioBytesReceived = audioBytesReceived;
7342
- networkStats.videoBytesSent = videoBytesSent;
7343
- networkStats.videoBytesReceived = videoBytesReceived;
7415
+ networkStats.totalVideoBytesSent = videoBytesSent;
7416
+ networkStats.videoBytesSent = videoBytesSent - lastVideoSent;
7417
+ networkStats.totalVideoBytesReceived = videoBytesReceived;
7418
+ networkStats.videoBytesReceived = videoBytesReceived - lastVideoReceived;
7419
+ networkStats.totalTransportSent = transportSent - lastTransportSent;
7344
7420
  networkStats.transportSent = transportSent;
7345
- networkStats.transportReceived = transportReceived;
7346
-
7347
- const bandwidth = (networkStats.audioBytesSent - lastAudioSent) + (networkStats.videoBytesSent - lastVideoSent)
7348
- + (networkStats.audioBytesReceived - lastAudioReceived) + (networkStats.videoBytesReceived - lastVideoReceived)
7349
- + (networkStats.transportReceived - lastTransportReceived) + (networkStats.transportSent - lastTransportSent);
7421
+ networkStats.totalTransportReceived = transportReceived;
7422
+ networkStats.transportReceived = transportReceived - lastTransportReceived;
7350
7423
 
7351
- networkStats.bandwidth = bandwidth;
7424
+ networkStats.bandwidth = networkStats.audioBytesSent + networkStats.audioBytesReceived
7425
+ + networkStats.videoBytesSent + networkStats.videoBytesReceived + networkStats.transportReceived
7426
+ + networkStats.transportSent;
7352
7427
 
7353
7428
  this.eventEmitter.emit(ON_NETWORK_STATS, session, networkStats, this.sessionNetworkStats[sessionId]);
7354
7429
  this.sessionNetworkStats[sessionId].push(networkStats);
@@ -421,6 +421,7 @@ class IssueReporter {
421
421
 
422
422
 
423
423
 
424
+
424
425
 
425
426
  constructor() {
426
427
  addLevelsTo(this);
@@ -432,12 +433,17 @@ class IssueReporter {
432
433
  this.bufferTimeout = null;
433
434
  this._boundProcessBuffer = this._processBuffer.bind(this);
434
435
  this._boundParseLoggerBody = this._parseLoggerBody.bind(this);
436
+ this._callback = null;
435
437
  }
436
438
 
437
439
  init() {
438
440
  this._catchConsole();
439
441
  }
440
442
 
443
+ setCallback(cb ) {
444
+ this._callback = cb;
445
+ }
446
+
441
447
  configureRemoteClient(configuration = { tag: 'wazo-sdk', host: null, port: null, level: null, extra: {} }) {
442
448
  this.remoteClientConfiguration = configuration;
443
449
  }
@@ -473,6 +479,7 @@ class IssueReporter {
473
479
 
474
480
  // Handle category label
475
481
  let category = null;
482
+ let skipSendToRemote = false;
476
483
  let extra = {};
477
484
  if (args[0].indexOf(CATEGORY_PREFIX) === 0) {
478
485
  category = args[0].split('=')[1];
@@ -488,6 +495,7 @@ class IssueReporter {
488
495
  errorMessage: lastArg.message,
489
496
  errorStack: lastArg.stack,
490
497
  errorType: lastArg.constructor.name,
498
+ skipSendToRemote: lastArg.skipSendToRemote,
491
499
  };
492
500
  } else {
493
501
  extra = lastArg;
@@ -496,6 +504,11 @@ class IssueReporter {
496
504
  args.splice(1, 1);
497
505
  }
498
506
 
507
+ if (extra.skipSendToRemote) {
508
+ skipSendToRemote = true;
509
+ delete extra.skipSendToRemote;
510
+ }
511
+
499
512
  const date = moment__default['default']().format('YYYY-MM-DD HH:mm:ss.SSS');
500
513
  const message = args.join(', ');
501
514
  let consoleMessage = message;
@@ -516,7 +529,13 @@ class IssueReporter {
516
529
  const oldMethod = this.oldConsoleMethods[consoleLevel] || this.oldConsoleMethods.log;
517
530
  oldMethod.apply(oldMethod, [date, consoleMessage]);
518
531
 
519
- this._sendToRemoteLogger(level, { date, message, category, ...extra });
532
+ if (this._callback) {
533
+ this._callback(level, consoleMessage);
534
+ }
535
+
536
+ if (!skipSendToRemote) {
537
+ this._sendToRemoteLogger(level, { date, message, category, ...extra });
538
+ }
520
539
  }
521
540
 
522
541
  logRequest(url , options , response , start ) {
@@ -661,7 +680,11 @@ class IssueReporter {
661
680
  },
662
681
  // $FlowFixMe
663
682
  body,
664
- }).catch(() => {
683
+ }).catch((e ) => {
684
+ // $FlowFixMe
685
+ e.skipSendToRemote = true;
686
+ this.log('error', this._makeCategory('grafana'), 'Sending log to grafana, error', e);
687
+
665
688
  setTimeout(() => {
666
689
  if (isArray) {
667
690
  payload = payload.map(message => {
@@ -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
  }
@@ -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),
@@ -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
 
@@ -3902,7 +3945,7 @@ class CallLog {
3902
3945
  duration: (plain.duration || 0) * 1000, // duration is in seconds
3903
3946
  start: moment__default['default'](plain.start).toDate(),
3904
3947
  end: plain.end ? moment__default['default'](plain.end).toDate() : null,
3905
- recordings: Recording.parseMany(plain.recordings),
3948
+ recordings: Recording.parseMany(plain.recordings || []),
3906
3949
  });
3907
3950
  }
3908
3951
 
@@ -5297,6 +5340,7 @@ const ON_REINVITE = 'reinvite';
5297
5340
  const ON_ERROR = 'onError';
5298
5341
  const ON_SCREEN_SHARING_REINVITE = 'onScreenSharingReinvite';
5299
5342
  const ON_NETWORK_STATS = 'onNetworkStats';
5343
+ const ON_DISCONNECTED = 'onDisconnected';
5300
5344
  class CanceledCallError extends Error {}
5301
5345
 
5302
5346
  const MAX_REGISTER_TRIES = 10;
@@ -5370,6 +5414,7 @@ class WebRTCClient extends Emitter {
5370
5414
 
5371
5415
 
5372
5416
 
5417
+
5373
5418
 
5374
5419
  static isAPrivateIp(ip ) {
5375
5420
  const regex = /^(?:10|127|172\.(?:1[6-9]|2[0-9]|3[01])|192\.168)\..*/;
@@ -5435,6 +5480,7 @@ class WebRTCClient extends Emitter {
5435
5480
  this.ON_ERROR = ON_ERROR;
5436
5481
  this.ON_SCREEN_SHARING_REINVITE = ON_SCREEN_SHARING_REINVITE;
5437
5482
  this.ON_NETWORK_STATS = ON_NETWORK_STATS;
5483
+ this.ON_DISCONNECTED = ON_DISCONNECTED;
5438
5484
  }
5439
5485
 
5440
5486
  configureMedia(media ) {
@@ -5700,7 +5746,9 @@ class WebRTCClient extends Emitter {
5700
5746
  const inviteOptions = {
5701
5747
  requestDelegate: {
5702
5748
  onAccept: (response ) => {
5703
- session.sessionDescriptionHandler.peerConnection.sfu = conference;
5749
+ if (session.sessionDescriptionHandler.peerConnection) {
5750
+ session.sessionDescriptionHandler.peerConnection.sfu = conference;
5751
+ }
5704
5752
  this._onAccepted(session, response.session, true);
5705
5753
  },
5706
5754
  onReject: (response ) => {
@@ -6036,7 +6084,7 @@ class WebRTCClient extends Emitter {
6036
6084
  // We search for the last transceiver without `video-` in the mid (video- means remote transceiver)
6037
6085
  const transceivers = pc.getTransceivers();
6038
6086
  const transceiverIdx = lastIndexOf(transceivers, transceiver =>
6039
- transceiver.sender.track === null && transceiver.mid.indexOf('video') === -1);
6087
+ transceiver.sender.track === null && transceiver.mid && transceiver.mid.indexOf('video') === -1);
6040
6088
 
6041
6089
  videoSender = transceiverIdx !== -1 ? transceivers[transceiverIdx].sender : null;
6042
6090
  } else {
@@ -6572,6 +6620,16 @@ class WebRTCClient extends Emitter {
6572
6620
  return this.hasRemoteVideo(sessionId) ? this.getRemoteStream(sessionId) : null;
6573
6621
  }
6574
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
+
6575
6633
  hasVideo(sessionId ) {
6576
6634
  return this.hasLocalVideo(sessionId) || this.hasRemoteVideo(sessionId);
6577
6635
  }
@@ -7061,6 +7119,7 @@ class WebRTCClient extends Emitter {
7061
7119
 
7062
7120
  this.updateRemoteStream(this.getSipSessionId(session));
7063
7121
 
7122
+ const pc = session.sessionDescriptionHandler.peerConnection;
7064
7123
  const onTrack = (event ) => {
7065
7124
  const isAudioOnly = this._isAudioOnly(session);
7066
7125
  const { kind, label, readyState, id, muted } = event.track;
@@ -7080,6 +7139,12 @@ class WebRTCClient extends Emitter {
7080
7139
 
7081
7140
  session.sessionDescriptionHandler.remoteMediaStream.onaddtrack = onTrack;
7082
7141
 
7142
+ pc.oniceconnectionstatechange = () => {
7143
+ if (pc.iceConnectionState === 'disconnected') {
7144
+ this.eventEmitter.emit(ON_DISCONNECTED);
7145
+ }
7146
+ };
7147
+
7083
7148
  if (withEvent) {
7084
7149
  this.eventEmitter.emit(ACCEPTED, session, sessionDialog);
7085
7150
  }
@@ -7299,6 +7364,7 @@ class WebRTCClient extends Emitter {
7299
7364
  let videoBytesReceived = 0;
7300
7365
  let transportSent = 0;
7301
7366
  let transportReceived = 0;
7367
+ let packetsLost = 0;
7302
7368
 
7303
7369
  stats.forEach(report => {
7304
7370
  if (report.type === 'outbound-rtp' && report.kind === 'audio') {
@@ -7311,7 +7377,7 @@ class WebRTCClient extends Emitter {
7311
7377
  videoBytesSent += report.bytesSent + report.headerBytesSent;
7312
7378
  }
7313
7379
  if (report.type === 'inbound-rtp' && report.kind === 'audio') {
7314
- networkStats.packetsLost = report.packetsLost;
7380
+ packetsLost += report.packetsLost;
7315
7381
  networkStats.packetsReceived = report.packetsReceived;
7316
7382
  audioBytesReceived += report.bytesReceived + report.headerBytesReceived;
7317
7383
  }
@@ -7328,27 +7394,36 @@ class WebRTCClient extends Emitter {
7328
7394
  }
7329
7395
  }
7330
7396
  if (report.type === 'remote-inbound-rtp' && report.kind === 'audio') {
7397
+ packetsLost += report.packetsLost;
7331
7398
  networkStats.roundTripTime = report.roundTripTime;
7332
7399
  networkStats.jitter = report.jitter;
7333
7400
  }
7401
+ if (report.type === 'remote-inbound-rtp' && report.kind === 'video') {
7402
+ packetsLost += report.packetsLost;
7403
+ }
7334
7404
  if (report.type === 'transport') {
7335
7405
  transportSent += report.bytesSent;
7336
7406
  transportReceived += report.bytesReceived;
7337
7407
  }
7338
7408
  });
7339
7409
 
7340
- networkStats.audioBytesSent = audioBytesSent;
7410
+ networkStats.packetsLost = packetsLost;
7411
+ networkStats.totalAudioBytesSent = audioBytesSent;
7412
+ networkStats.audioBytesSent = audioBytesSent - lastAudioSent;
7413
+ networkStats.totalAudioBytesReceived = audioBytesReceived - lastAudioReceived;
7341
7414
  networkStats.audioBytesReceived = audioBytesReceived;
7342
- networkStats.videoBytesSent = videoBytesSent;
7343
- networkStats.videoBytesReceived = videoBytesReceived;
7415
+ networkStats.totalVideoBytesSent = videoBytesSent;
7416
+ networkStats.videoBytesSent = videoBytesSent - lastVideoSent;
7417
+ networkStats.totalVideoBytesReceived = videoBytesReceived;
7418
+ networkStats.videoBytesReceived = videoBytesReceived - lastVideoReceived;
7419
+ networkStats.totalTransportSent = transportSent - lastTransportSent;
7344
7420
  networkStats.transportSent = transportSent;
7345
- networkStats.transportReceived = transportReceived;
7346
-
7347
- const bandwidth = (networkStats.audioBytesSent - lastAudioSent) + (networkStats.videoBytesSent - lastVideoSent)
7348
- + (networkStats.audioBytesReceived - lastAudioReceived) + (networkStats.videoBytesReceived - lastVideoReceived)
7349
- + (networkStats.transportReceived - lastTransportReceived) + (networkStats.transportSent - lastTransportSent);
7421
+ networkStats.totalTransportReceived = transportReceived;
7422
+ networkStats.transportReceived = transportReceived - lastTransportReceived;
7350
7423
 
7351
- networkStats.bandwidth = bandwidth;
7424
+ networkStats.bandwidth = networkStats.audioBytesSent + networkStats.audioBytesReceived
7425
+ + networkStats.videoBytesSent + networkStats.videoBytesReceived + networkStats.transportReceived
7426
+ + networkStats.transportSent;
7352
7427
 
7353
7428
  this.eventEmitter.emit(ON_NETWORK_STATS, session, networkStats, this.sessionNetworkStats[sessionId]);
7354
7429
  this.sessionNetworkStats[sessionId].push(networkStats);