@wazo/sdk 0.37.16 → 0.37.20

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 (114) hide show
  1. package/dist/wazo-sdk.js +5 -5
  2. package/esm/__tests__/api-client.test.js +9 -5
  3. package/esm/__tests__/web-rtc-client.test.js +69 -19
  4. package/esm/api/agentd.js +1 -1
  5. package/esm/api/amid.js +1 -1
  6. package/esm/api/application.js +1 -1
  7. package/esm/api/auth.js +1 -1
  8. package/esm/api/call-logd.js +3 -3
  9. package/esm/api/calld.js +1 -1
  10. package/esm/api/chatd.js +1 -1
  11. package/esm/api/confd.js +7 -3
  12. package/esm/api/ctid-ng.js +1 -1
  13. package/esm/api/dird.js +1 -1
  14. package/esm/api/webhookd.js +1 -1
  15. package/esm/api-client.js +9 -5
  16. package/esm/checker/Checker.js +69 -19
  17. package/esm/checker/checks/aor.js +9 -5
  18. package/esm/checker/checks/api.js +9 -5
  19. package/esm/checker/checks/index.js +69 -19
  20. package/esm/checker/checks/wazo-websocket.js +1 -1
  21. package/esm/checker/checks/webrtc-transport.js +69 -19
  22. package/esm/checker/checks/webrtc.js +69 -19
  23. package/esm/domain/AdHocAPIConference.js +9 -5
  24. package/esm/domain/CallLog.js +2 -2
  25. package/esm/domain/Features.js +9 -5
  26. package/esm/domain/Meeting.js +6 -2
  27. package/esm/domain/Phone/CTIPhone.js +9 -5
  28. package/esm/domain/Phone/WebRTCPhone.js +9 -2
  29. package/esm/domain/Recording.js +1 -1
  30. package/esm/domain/__tests__/CallLog.test.js +2 -2
  31. package/esm/index.js +77 -19
  32. package/esm/lib/WazoSessionDescriptionHandler.js +1 -1
  33. package/esm/service/CallApi.js +9 -5
  34. package/esm/service/IssueReporter.js +1 -1
  35. package/esm/service/__tests__/IssueReporter.test.js +1 -1
  36. package/esm/service/getApiClient.js +9 -5
  37. package/esm/simple/Auth.js +77 -19
  38. package/esm/simple/Configuration.js +77 -19
  39. package/esm/simple/Directory.js +9 -5
  40. package/esm/simple/Phone.js +77 -19
  41. package/esm/simple/Websocket.js +1 -1
  42. package/esm/simple/index.js +77 -19
  43. package/esm/simple/room/LocalParticipant.js +77 -19
  44. package/esm/simple/room/Participant.js +77 -19
  45. package/esm/simple/room/RemoteParticipant.js +77 -19
  46. package/esm/simple/room/Room.js +77 -19
  47. package/esm/simple/room/SipRoom.js +77 -19
  48. package/esm/simple/room/Stream.js +77 -19
  49. package/esm/simple/room/__tests__/RemoteParticipant.test.js +77 -19
  50. package/esm/simple/utils.js +77 -19
  51. package/esm/utils/__tests__/api-requester.test.js +1 -1
  52. package/esm/utils/api-requester.js +1 -1
  53. package/esm/web-rtc-client.js +69 -19
  54. package/esm/websocket-client.js +1 -1
  55. package/lib/__tests__/api-client.test.js +9 -5
  56. package/lib/__tests__/web-rtc-client.test.js +69 -19
  57. package/lib/api/agentd.js +1 -1
  58. package/lib/api/amid.js +1 -1
  59. package/lib/api/application.js +1 -1
  60. package/lib/api/auth.js +1 -1
  61. package/lib/api/call-logd.js +3 -3
  62. package/lib/api/calld.js +1 -1
  63. package/lib/api/chatd.js +1 -1
  64. package/lib/api/confd.js +7 -3
  65. package/lib/api/ctid-ng.js +1 -1
  66. package/lib/api/dird.js +1 -1
  67. package/lib/api/webhookd.js +1 -1
  68. package/lib/api-client.js +9 -5
  69. package/lib/checker/Checker.js +69 -19
  70. package/lib/checker/checks/aor.js +9 -5
  71. package/lib/checker/checks/api.js +9 -5
  72. package/lib/checker/checks/index.js +69 -19
  73. package/lib/checker/checks/wazo-websocket.js +1 -1
  74. package/lib/checker/checks/webrtc-transport.js +69 -19
  75. package/lib/checker/checks/webrtc.js +69 -19
  76. package/lib/domain/AdHocAPIConference.js +9 -5
  77. package/lib/domain/CallLog.js +2 -2
  78. package/lib/domain/Features.js +9 -5
  79. package/lib/domain/Meeting.js +6 -2
  80. package/lib/domain/Phone/CTIPhone.js +9 -5
  81. package/lib/domain/Phone/WebRTCPhone.js +9 -1
  82. package/lib/domain/Recording.js +1 -1
  83. package/lib/domain/__tests__/CallLog.test.js +2 -2
  84. package/lib/index.js +77 -19
  85. package/lib/lib/WazoSessionDescriptionHandler.js +1 -1
  86. package/lib/service/CallApi.js +9 -5
  87. package/lib/service/IssueReporter.js +1 -1
  88. package/lib/service/__tests__/IssueReporter.test.js +1 -1
  89. package/lib/service/getApiClient.js +9 -5
  90. package/lib/simple/Auth.js +77 -19
  91. package/lib/simple/Configuration.js +77 -19
  92. package/lib/simple/Directory.js +9 -5
  93. package/lib/simple/Phone.js +77 -19
  94. package/lib/simple/Websocket.js +1 -1
  95. package/lib/simple/index.js +77 -19
  96. package/lib/simple/room/LocalParticipant.js +77 -19
  97. package/lib/simple/room/Participant.js +77 -19
  98. package/lib/simple/room/RemoteParticipant.js +77 -19
  99. package/lib/simple/room/Room.js +77 -19
  100. package/lib/simple/room/SipRoom.js +77 -19
  101. package/lib/simple/room/Stream.js +77 -19
  102. package/lib/simple/room/__tests__/RemoteParticipant.test.js +77 -19
  103. package/lib/simple/utils.js +77 -19
  104. package/lib/utils/__tests__/api-requester.test.js +1 -1
  105. package/lib/utils/api-requester.js +1 -1
  106. package/lib/web-rtc-client.js +69 -19
  107. package/lib/websocket-client.js +1 -1
  108. package/package.json +2 -2
  109. package/src/domain/CallLog.js +1 -1
  110. package/src/domain/Meeting.js +6 -2
  111. package/src/domain/Phone/WebRTCPhone.js +7 -0
  112. package/src/domain/Recording.js +1 -1
  113. package/src/service/IssueReporter.js +1 -1
  114. package/src/web-rtc-client.js +60 -14
@@ -664,7 +664,7 @@ class IssueReporter {
664
664
  payload._retry = retry + 1;
665
665
  }
666
666
 
667
- this._sendDebugToGrafana(body, retry + 1);
667
+ this._sendDebugToGrafana(payload, retry + 1);
668
668
  }, 5000 + retry * 1000);
669
669
  });
670
670
  }
@@ -3166,7 +3166,8 @@ class ExternalApp {
3166
3166
 
3167
3167
 
3168
3168
 
3169
-
3169
+
3170
+
3170
3171
 
3171
3172
 
3172
3173
  class Meeting {
@@ -3178,6 +3179,7 @@ class Meeting {
3178
3179
 
3179
3180
 
3180
3181
 
3182
+
3181
3183
 
3182
3184
 
3183
3185
  static parse(plain ) {
@@ -3189,6 +3191,7 @@ class Meeting {
3189
3191
  port: plain.port,
3190
3192
  uuid: plain.uuid,
3191
3193
  number: plain.number,
3194
+ persistent: plain.persistent,
3192
3195
  });
3193
3196
  }
3194
3197
 
@@ -3196,7 +3199,7 @@ class Meeting {
3196
3199
  return newFrom(meeting, Meeting);
3197
3200
  }
3198
3201
 
3199
- constructor({ uuid, name, guestSipAuthorization, ownerUuids, port, uri, number } = {}) {
3202
+ constructor({ uuid, name, guestSipAuthorization, ownerUuids, port, uri, number, persistent } = {}) {
3200
3203
  this.guestSipAuthorization = guestSipAuthorization;
3201
3204
  this.uri = uri;
3202
3205
  this.name = name;
@@ -3204,6 +3207,7 @@ class Meeting {
3204
3207
  this.port = port;
3205
3208
  this.uuid = uuid;
3206
3209
  this.number = number;
3210
+ this.persistent = persistent;
3207
3211
 
3208
3212
  // Useful to compare instead of instanceof with minified code
3209
3213
  this.type = 'Meeting';
@@ -3767,7 +3771,7 @@ class Recording {
3767
3771
 
3768
3772
 
3769
3773
 
3770
- static parseMany(recordings ) {
3774
+ static parseMany(recordings = []) {
3771
3775
  return recordings.map(item => Recording.parse(item));
3772
3776
  }
3773
3777
 
@@ -3893,7 +3897,7 @@ class CallLog {
3893
3897
  duration: (plain.duration || 0) * 1000, // duration is in seconds
3894
3898
  start: moment(plain.start).toDate(),
3895
3899
  end: plain.end ? moment(plain.end).toDate() : null,
3896
- recordings: Recording.parseMany(plain.recordings),
3900
+ recordings: Recording.parseMany(plain.recordings || []),
3897
3901
  });
3898
3902
  }
3899
3903
 
@@ -5288,6 +5292,7 @@ const ON_REINVITE = 'reinvite';
5288
5292
  const ON_ERROR = 'onError';
5289
5293
  const ON_SCREEN_SHARING_REINVITE = 'onScreenSharingReinvite';
5290
5294
  const ON_NETWORK_STATS = 'onNetworkStats';
5295
+ const ON_DISCONNECTED = 'onDisconnected';
5291
5296
 
5292
5297
  const events = [REGISTERED, UNREGISTERED, REGISTRATION_FAILED, INVITE];
5293
5298
  const transportEvents = [CONNECTED, DISCONNECTED, TRANSPORT_ERROR, MESSAGE];
@@ -5364,6 +5369,7 @@ class WebRTCClient extends Emitter {
5364
5369
 
5365
5370
 
5366
5371
 
5372
+
5367
5373
 
5368
5374
  static isAPrivateIp(ip ) {
5369
5375
  const regex = /^(?:10|127|172\.(?:1[6-9]|2[0-9]|3[01])|192\.168)\..*/;
@@ -5429,6 +5435,7 @@ class WebRTCClient extends Emitter {
5429
5435
  this.ON_ERROR = ON_ERROR;
5430
5436
  this.ON_SCREEN_SHARING_REINVITE = ON_SCREEN_SHARING_REINVITE;
5431
5437
  this.ON_NETWORK_STATS = ON_NETWORK_STATS;
5438
+ this.ON_DISCONNECTED = ON_DISCONNECTED;
5432
5439
  }
5433
5440
 
5434
5441
  configureMedia(media ) {
@@ -6030,7 +6037,7 @@ class WebRTCClient extends Emitter {
6030
6037
  // We search for the last transceiver without `video-` in the mid (video- means remote transceiver)
6031
6038
  const transceivers = pc.getTransceivers();
6032
6039
  const transceiverIdx = lastIndexOf(transceivers, transceiver =>
6033
- transceiver.sender.track === null && transceiver.mid.indexOf('video') === -1);
6040
+ transceiver.sender.track === null && transceiver.mid && transceiver.mid.indexOf('video') === -1);
6034
6041
 
6035
6042
  videoSender = transceiverIdx !== -1 ? transceivers[transceiverIdx].sender : null;
6036
6043
  } else {
@@ -6276,10 +6283,13 @@ class WebRTCClient extends Emitter {
6276
6283
  return null;
6277
6284
  }
6278
6285
 
6279
- // let's update the local value
6280
- if (this.audio && this.audio.deviceId) {
6281
- // $FlowFixMe
6282
- this.audio.deviceId.exact = id;
6286
+ // let's update the local audio value
6287
+ if (this.audio) {
6288
+ this.audio = {
6289
+ deviceId: {
6290
+ exact: id,
6291
+ },
6292
+ };
6283
6293
  }
6284
6294
 
6285
6295
  if (session) {
@@ -6292,6 +6302,9 @@ class WebRTCClient extends Emitter {
6292
6302
  const sender = pc && pc.getSenders().find(s => audioTrack && s && s.track && s.track.kind === audioTrack.kind);
6293
6303
 
6294
6304
  if (sender) {
6305
+ if (sender.track) {
6306
+ audioTrack.enabled = sender.track.enabled;
6307
+ }
6295
6308
  sender.replaceTrack(audioTrack);
6296
6309
  }
6297
6310
 
@@ -6316,7 +6329,7 @@ class WebRTCClient extends Emitter {
6316
6329
  return null;
6317
6330
  }
6318
6331
 
6319
- // let's update the local value
6332
+ // let's update the local video value
6320
6333
  if (this.video) {
6321
6334
  this.video = {
6322
6335
  deviceId: {
@@ -6351,12 +6364,21 @@ class WebRTCClient extends Emitter {
6351
6364
  return navigator.mediaDevices.getUserMedia(constraints).then(async stream => {
6352
6365
  const videoTrack = stream.getVideoTracks()[0];
6353
6366
  let sender = pc && pc.getSenders().find(s => videoTrack && s && s.track && s.track.kind === videoTrack.kind);
6367
+ let wasTrackEnabled = false;
6354
6368
  if (!sender) {
6355
6369
  sender = pc && pc.getSenders().find(s => !s.track);
6356
6370
  }
6357
6371
 
6358
6372
  if (sender) {
6359
- sender.replaceTrack(videoTrack);
6373
+ // No video track means video not enabled
6374
+ wasTrackEnabled = sender.track ? sender.track.enabled : false;
6375
+ videoTrack.enabled = wasTrackEnabled;
6376
+
6377
+ if (!wasTrackEnabled) {
6378
+ videoTrack.stop();
6379
+ }
6380
+
6381
+ sender.replaceTrack(wasTrackEnabled ? videoTrack : null);
6360
6382
  }
6361
6383
 
6362
6384
  // let's update the local stream
@@ -7040,6 +7062,7 @@ class WebRTCClient extends Emitter {
7040
7062
 
7041
7063
  this.updateRemoteStream(this.getSipSessionId(session));
7042
7064
 
7065
+ const pc = session.sessionDescriptionHandler.peerConnection;
7043
7066
  const onTrack = (event ) => {
7044
7067
  const isAudioOnly = this._isAudioOnly(session);
7045
7068
  const { kind, label, readyState, id, muted } = event.track;
@@ -7059,6 +7082,12 @@ class WebRTCClient extends Emitter {
7059
7082
 
7060
7083
  session.sessionDescriptionHandler.remoteMediaStream.onaddtrack = onTrack;
7061
7084
 
7085
+ pc.oniceconnectionstatechange = () => {
7086
+ if (pc.iceConnectionState === 'disconnected') {
7087
+ this.eventEmitter.emit(ON_DISCONNECTED);
7088
+ }
7089
+ };
7090
+
7062
7091
  if (withEvent) {
7063
7092
  this.eventEmitter.emit(ACCEPTED, session, sessionDialog);
7064
7093
  }
@@ -7270,25 +7299,33 @@ class WebRTCClient extends Emitter {
7270
7299
  const lastVideoSent = lastNetworkStats ? lastNetworkStats.videoBytesSent : 0;
7271
7300
  const lastAudioReceived = lastNetworkStats ? lastNetworkStats.audioBytesReceived : 0;
7272
7301
  const lastVideoReceived = lastNetworkStats ? lastNetworkStats.videoBytesReceived : 0;
7302
+ const lastTransportSent = lastNetworkStats ? lastNetworkStats.transportSent : 0;
7303
+ const lastTransportReceived = lastNetworkStats ? lastNetworkStats.transportReceived : 0;
7273
7304
  let audioBytesSent = 0;
7274
7305
  let audioBytesReceived = 0;
7275
7306
  let videoBytesSent = 0;
7276
7307
  let videoBytesReceived = 0;
7308
+ let transportSent = 0;
7309
+ let transportReceived = 0;
7310
+ let packetsLost = 0;
7277
7311
 
7278
7312
  stats.forEach(report => {
7279
7313
  if (report.type === 'outbound-rtp' && report.kind === 'audio') {
7314
+ audioBytesSent += report.bytesSent + report.headerBytesSent;
7315
+ }
7316
+ if (report.type === 'remote-outbound-rtp' && report.kind === 'audio') {
7280
7317
  audioBytesSent += report.bytesSent;
7281
7318
  }
7282
7319
  if (report.type === 'outbound-rtp' && report.kind === 'video') {
7283
- videoBytesSent += report.bytesSent;
7320
+ videoBytesSent += report.bytesSent + report.headerBytesSent;
7284
7321
  }
7285
7322
  if (report.type === 'inbound-rtp' && report.kind === 'audio') {
7286
- networkStats.packetsLost = report.packetsLost;
7323
+ packetsLost += report.packetsLost;
7287
7324
  networkStats.packetsReceived = report.packetsReceived;
7288
- audioBytesReceived += report.bytesReceived;
7325
+ audioBytesReceived += report.bytesReceived + report.headerBytesReceived;
7289
7326
  }
7290
7327
  if (report.type === 'inbound-rtp' && report.kind === 'video') {
7291
- videoBytesReceived += report.bytesReceived;
7328
+ videoBytesReceived += report.bytesReceived + report.headerBytesReceived;
7292
7329
  }
7293
7330
  if (report.type === 'outbound-rtp' && report.kind === 'video') {
7294
7331
  if ('framesPerSecond' in report) {
@@ -7300,19 +7337,32 @@ class WebRTCClient extends Emitter {
7300
7337
  }
7301
7338
  }
7302
7339
  if (report.type === 'remote-inbound-rtp' && report.kind === 'audio') {
7340
+ packetsLost += report.packetsLost;
7303
7341
  networkStats.roundTripTime = report.roundTripTime;
7304
7342
  networkStats.jitter = report.jitter;
7305
7343
  }
7344
+ if (report.type === 'remote-inbound-rtp' && report.kind === 'video') {
7345
+ packetsLost += report.packetsLost;
7346
+ }
7347
+ if (report.type === 'transport') {
7348
+ transportSent += report.bytesSent;
7349
+ transportReceived += report.bytesReceived;
7350
+ }
7306
7351
  });
7307
7352
 
7353
+ networkStats.packetsLost = packetsLost;
7308
7354
  networkStats.audioBytesSent = audioBytesSent;
7309
7355
  networkStats.audioBytesReceived = audioBytesReceived;
7310
7356
  networkStats.videoBytesSent = videoBytesSent;
7311
7357
  networkStats.videoBytesReceived = videoBytesReceived;
7358
+ networkStats.transportSent = transportSent;
7359
+ networkStats.transportReceived = transportReceived;
7360
+
7361
+ const bandwidth = (networkStats.audioBytesSent - lastAudioSent) + (networkStats.videoBytesSent - lastVideoSent)
7362
+ + (networkStats.audioBytesReceived - lastAudioReceived) + (networkStats.videoBytesReceived - lastVideoReceived)
7363
+ + (networkStats.transportReceived - lastTransportReceived) + (networkStats.transportSent - lastTransportSent);
7312
7364
 
7313
- networkStats.bandwidth = (networkStats.audioBytesSent - lastAudioSent)
7314
- + (networkStats.videoBytesSent - lastVideoSent) + (networkStats.audioBytesReceived - lastAudioReceived)
7315
- + (networkStats.videoBytesReceived - lastVideoReceived);
7365
+ networkStats.bandwidth = bandwidth;
7316
7366
 
7317
7367
  this.eventEmitter.emit(ON_NETWORK_STATS, session, networkStats, this.sessionNetworkStats[sessionId]);
7318
7368
  this.sessionNetworkStats[sessionId].push(networkStats);
@@ -373,7 +373,7 @@ class IssueReporter {
373
373
  payload._retry = retry + 1;
374
374
  }
375
375
 
376
- this._sendDebugToGrafana(body, retry + 1);
376
+ this._sendDebugToGrafana(payload, retry + 1);
377
377
  }, 5000 + retry * 1000);
378
378
  });
379
379
  }
@@ -388,7 +388,7 @@ class IssueReporter {
388
388
  payload._retry = retry + 1;
389
389
  }
390
390
 
391
- this._sendDebugToGrafana(body, retry + 1);
391
+ this._sendDebugToGrafana(payload, retry + 1);
392
392
  }, 5000 + retry * 1000);
393
393
  });
394
394
  }
@@ -2591,7 +2591,8 @@ class ExternalApp {
2591
2591
 
2592
2592
 
2593
2593
 
2594
-
2594
+
2595
+
2595
2596
 
2596
2597
 
2597
2598
  class Meeting {
@@ -2603,6 +2604,7 @@ class Meeting {
2603
2604
 
2604
2605
 
2605
2606
 
2607
+
2606
2608
 
2607
2609
 
2608
2610
  static parse(plain ) {
@@ -2614,6 +2616,7 @@ class Meeting {
2614
2616
  port: plain.port,
2615
2617
  uuid: plain.uuid,
2616
2618
  number: plain.number,
2619
+ persistent: plain.persistent,
2617
2620
  });
2618
2621
  }
2619
2622
 
@@ -2621,7 +2624,7 @@ class Meeting {
2621
2624
  return newFrom(meeting, Meeting);
2622
2625
  }
2623
2626
 
2624
- constructor({ uuid, name, guestSipAuthorization, ownerUuids, port, uri, number } = {}) {
2627
+ constructor({ uuid, name, guestSipAuthorization, ownerUuids, port, uri, number, persistent } = {}) {
2625
2628
  this.guestSipAuthorization = guestSipAuthorization;
2626
2629
  this.uri = uri;
2627
2630
  this.name = name;
@@ -2629,6 +2632,7 @@ class Meeting {
2629
2632
  this.port = port;
2630
2633
  this.uuid = uuid;
2631
2634
  this.number = number;
2635
+ this.persistent = persistent;
2632
2636
 
2633
2637
  // Useful to compare instead of instanceof with minified code
2634
2638
  this.type = 'Meeting';
@@ -3192,7 +3196,7 @@ class Recording {
3192
3196
 
3193
3197
 
3194
3198
 
3195
- static parseMany(recordings ) {
3199
+ static parseMany(recordings = []) {
3196
3200
  return recordings.map(item => Recording.parse(item));
3197
3201
  }
3198
3202
 
@@ -3318,7 +3322,7 @@ class CallLog {
3318
3322
  duration: (plain.duration || 0) * 1000, // duration is in seconds
3319
3323
  start: moment__default['default'](plain.start).toDate(),
3320
3324
  end: plain.end ? moment__default['default'](plain.end).toDate() : null,
3321
- recordings: Recording.parseMany(plain.recordings),
3325
+ recordings: Recording.parseMany(plain.recordings || []),
3322
3326
  });
3323
3327
  }
3324
3328
 
@@ -673,7 +673,7 @@ class IssueReporter {
673
673
  payload._retry = retry + 1;
674
674
  }
675
675
 
676
- this._sendDebugToGrafana(body, retry + 1);
676
+ this._sendDebugToGrafana(payload, retry + 1);
677
677
  }, 5000 + retry * 1000);
678
678
  });
679
679
  }
@@ -3175,7 +3175,8 @@ class ExternalApp {
3175
3175
 
3176
3176
 
3177
3177
 
3178
-
3178
+
3179
+
3179
3180
 
3180
3181
 
3181
3182
  class Meeting {
@@ -3187,6 +3188,7 @@ class Meeting {
3187
3188
 
3188
3189
 
3189
3190
 
3191
+
3190
3192
 
3191
3193
 
3192
3194
  static parse(plain ) {
@@ -3198,6 +3200,7 @@ class Meeting {
3198
3200
  port: plain.port,
3199
3201
  uuid: plain.uuid,
3200
3202
  number: plain.number,
3203
+ persistent: plain.persistent,
3201
3204
  });
3202
3205
  }
3203
3206
 
@@ -3205,7 +3208,7 @@ class Meeting {
3205
3208
  return newFrom(meeting, Meeting);
3206
3209
  }
3207
3210
 
3208
- constructor({ uuid, name, guestSipAuthorization, ownerUuids, port, uri, number } = {}) {
3211
+ constructor({ uuid, name, guestSipAuthorization, ownerUuids, port, uri, number, persistent } = {}) {
3209
3212
  this.guestSipAuthorization = guestSipAuthorization;
3210
3213
  this.uri = uri;
3211
3214
  this.name = name;
@@ -3213,6 +3216,7 @@ class Meeting {
3213
3216
  this.port = port;
3214
3217
  this.uuid = uuid;
3215
3218
  this.number = number;
3219
+ this.persistent = persistent;
3216
3220
 
3217
3221
  // Useful to compare instead of instanceof with minified code
3218
3222
  this.type = 'Meeting';
@@ -3776,7 +3780,7 @@ class Recording {
3776
3780
 
3777
3781
 
3778
3782
 
3779
- static parseMany(recordings ) {
3783
+ static parseMany(recordings = []) {
3780
3784
  return recordings.map(item => Recording.parse(item));
3781
3785
  }
3782
3786
 
@@ -3902,7 +3906,7 @@ class CallLog {
3902
3906
  duration: (plain.duration || 0) * 1000, // duration is in seconds
3903
3907
  start: moment__default['default'](plain.start).toDate(),
3904
3908
  end: plain.end ? moment__default['default'](plain.end).toDate() : null,
3905
- recordings: Recording.parseMany(plain.recordings),
3909
+ recordings: Recording.parseMany(plain.recordings || []),
3906
3910
  });
3907
3911
  }
3908
3912
 
@@ -5297,6 +5301,7 @@ const ON_REINVITE = 'reinvite';
5297
5301
  const ON_ERROR = 'onError';
5298
5302
  const ON_SCREEN_SHARING_REINVITE = 'onScreenSharingReinvite';
5299
5303
  const ON_NETWORK_STATS = 'onNetworkStats';
5304
+ const ON_DISCONNECTED = 'onDisconnected';
5300
5305
  class CanceledCallError extends Error {}
5301
5306
 
5302
5307
  const MAX_REGISTER_TRIES = 10;
@@ -5370,6 +5375,7 @@ class WebRTCClient extends Emitter {
5370
5375
 
5371
5376
 
5372
5377
 
5378
+
5373
5379
 
5374
5380
  static isAPrivateIp(ip ) {
5375
5381
  const regex = /^(?:10|127|172\.(?:1[6-9]|2[0-9]|3[01])|192\.168)\..*/;
@@ -5435,6 +5441,7 @@ class WebRTCClient extends Emitter {
5435
5441
  this.ON_ERROR = ON_ERROR;
5436
5442
  this.ON_SCREEN_SHARING_REINVITE = ON_SCREEN_SHARING_REINVITE;
5437
5443
  this.ON_NETWORK_STATS = ON_NETWORK_STATS;
5444
+ this.ON_DISCONNECTED = ON_DISCONNECTED;
5438
5445
  }
5439
5446
 
5440
5447
  configureMedia(media ) {
@@ -6036,7 +6043,7 @@ class WebRTCClient extends Emitter {
6036
6043
  // We search for the last transceiver without `video-` in the mid (video- means remote transceiver)
6037
6044
  const transceivers = pc.getTransceivers();
6038
6045
  const transceiverIdx = lastIndexOf(transceivers, transceiver =>
6039
- transceiver.sender.track === null && transceiver.mid.indexOf('video') === -1);
6046
+ transceiver.sender.track === null && transceiver.mid && transceiver.mid.indexOf('video') === -1);
6040
6047
 
6041
6048
  videoSender = transceiverIdx !== -1 ? transceivers[transceiverIdx].sender : null;
6042
6049
  } else {
@@ -6282,10 +6289,13 @@ class WebRTCClient extends Emitter {
6282
6289
  return null;
6283
6290
  }
6284
6291
 
6285
- // let's update the local value
6286
- if (this.audio && this.audio.deviceId) {
6287
- // $FlowFixMe
6288
- this.audio.deviceId.exact = id;
6292
+ // let's update the local audio value
6293
+ if (this.audio) {
6294
+ this.audio = {
6295
+ deviceId: {
6296
+ exact: id,
6297
+ },
6298
+ };
6289
6299
  }
6290
6300
 
6291
6301
  if (session) {
@@ -6298,6 +6308,9 @@ class WebRTCClient extends Emitter {
6298
6308
  const sender = pc && pc.getSenders().find(s => audioTrack && s && s.track && s.track.kind === audioTrack.kind);
6299
6309
 
6300
6310
  if (sender) {
6311
+ if (sender.track) {
6312
+ audioTrack.enabled = sender.track.enabled;
6313
+ }
6301
6314
  sender.replaceTrack(audioTrack);
6302
6315
  }
6303
6316
 
@@ -6322,7 +6335,7 @@ class WebRTCClient extends Emitter {
6322
6335
  return null;
6323
6336
  }
6324
6337
 
6325
- // let's update the local value
6338
+ // let's update the local video value
6326
6339
  if (this.video) {
6327
6340
  this.video = {
6328
6341
  deviceId: {
@@ -6357,12 +6370,21 @@ class WebRTCClient extends Emitter {
6357
6370
  return navigator.mediaDevices.getUserMedia(constraints).then(async stream => {
6358
6371
  const videoTrack = stream.getVideoTracks()[0];
6359
6372
  let sender = pc && pc.getSenders().find(s => videoTrack && s && s.track && s.track.kind === videoTrack.kind);
6373
+ let wasTrackEnabled = false;
6360
6374
  if (!sender) {
6361
6375
  sender = pc && pc.getSenders().find(s => !s.track);
6362
6376
  }
6363
6377
 
6364
6378
  if (sender) {
6365
- sender.replaceTrack(videoTrack);
6379
+ // No video track means video not enabled
6380
+ wasTrackEnabled = sender.track ? sender.track.enabled : false;
6381
+ videoTrack.enabled = wasTrackEnabled;
6382
+
6383
+ if (!wasTrackEnabled) {
6384
+ videoTrack.stop();
6385
+ }
6386
+
6387
+ sender.replaceTrack(wasTrackEnabled ? videoTrack : null);
6366
6388
  }
6367
6389
 
6368
6390
  // let's update the local stream
@@ -7046,6 +7068,7 @@ class WebRTCClient extends Emitter {
7046
7068
 
7047
7069
  this.updateRemoteStream(this.getSipSessionId(session));
7048
7070
 
7071
+ const pc = session.sessionDescriptionHandler.peerConnection;
7049
7072
  const onTrack = (event ) => {
7050
7073
  const isAudioOnly = this._isAudioOnly(session);
7051
7074
  const { kind, label, readyState, id, muted } = event.track;
@@ -7065,6 +7088,12 @@ class WebRTCClient extends Emitter {
7065
7088
 
7066
7089
  session.sessionDescriptionHandler.remoteMediaStream.onaddtrack = onTrack;
7067
7090
 
7091
+ pc.oniceconnectionstatechange = () => {
7092
+ if (pc.iceConnectionState === 'disconnected') {
7093
+ this.eventEmitter.emit(ON_DISCONNECTED);
7094
+ }
7095
+ };
7096
+
7068
7097
  if (withEvent) {
7069
7098
  this.eventEmitter.emit(ACCEPTED, session, sessionDialog);
7070
7099
  }
@@ -7276,25 +7305,33 @@ class WebRTCClient extends Emitter {
7276
7305
  const lastVideoSent = lastNetworkStats ? lastNetworkStats.videoBytesSent : 0;
7277
7306
  const lastAudioReceived = lastNetworkStats ? lastNetworkStats.audioBytesReceived : 0;
7278
7307
  const lastVideoReceived = lastNetworkStats ? lastNetworkStats.videoBytesReceived : 0;
7308
+ const lastTransportSent = lastNetworkStats ? lastNetworkStats.transportSent : 0;
7309
+ const lastTransportReceived = lastNetworkStats ? lastNetworkStats.transportReceived : 0;
7279
7310
  let audioBytesSent = 0;
7280
7311
  let audioBytesReceived = 0;
7281
7312
  let videoBytesSent = 0;
7282
7313
  let videoBytesReceived = 0;
7314
+ let transportSent = 0;
7315
+ let transportReceived = 0;
7316
+ let packetsLost = 0;
7283
7317
 
7284
7318
  stats.forEach(report => {
7285
7319
  if (report.type === 'outbound-rtp' && report.kind === 'audio') {
7320
+ audioBytesSent += report.bytesSent + report.headerBytesSent;
7321
+ }
7322
+ if (report.type === 'remote-outbound-rtp' && report.kind === 'audio') {
7286
7323
  audioBytesSent += report.bytesSent;
7287
7324
  }
7288
7325
  if (report.type === 'outbound-rtp' && report.kind === 'video') {
7289
- videoBytesSent += report.bytesSent;
7326
+ videoBytesSent += report.bytesSent + report.headerBytesSent;
7290
7327
  }
7291
7328
  if (report.type === 'inbound-rtp' && report.kind === 'audio') {
7292
- networkStats.packetsLost = report.packetsLost;
7329
+ packetsLost += report.packetsLost;
7293
7330
  networkStats.packetsReceived = report.packetsReceived;
7294
- audioBytesReceived += report.bytesReceived;
7331
+ audioBytesReceived += report.bytesReceived + report.headerBytesReceived;
7295
7332
  }
7296
7333
  if (report.type === 'inbound-rtp' && report.kind === 'video') {
7297
- videoBytesReceived += report.bytesReceived;
7334
+ videoBytesReceived += report.bytesReceived + report.headerBytesReceived;
7298
7335
  }
7299
7336
  if (report.type === 'outbound-rtp' && report.kind === 'video') {
7300
7337
  if ('framesPerSecond' in report) {
@@ -7306,19 +7343,32 @@ class WebRTCClient extends Emitter {
7306
7343
  }
7307
7344
  }
7308
7345
  if (report.type === 'remote-inbound-rtp' && report.kind === 'audio') {
7346
+ packetsLost += report.packetsLost;
7309
7347
  networkStats.roundTripTime = report.roundTripTime;
7310
7348
  networkStats.jitter = report.jitter;
7311
7349
  }
7350
+ if (report.type === 'remote-inbound-rtp' && report.kind === 'video') {
7351
+ packetsLost += report.packetsLost;
7352
+ }
7353
+ if (report.type === 'transport') {
7354
+ transportSent += report.bytesSent;
7355
+ transportReceived += report.bytesReceived;
7356
+ }
7312
7357
  });
7313
7358
 
7359
+ networkStats.packetsLost = packetsLost;
7314
7360
  networkStats.audioBytesSent = audioBytesSent;
7315
7361
  networkStats.audioBytesReceived = audioBytesReceived;
7316
7362
  networkStats.videoBytesSent = videoBytesSent;
7317
7363
  networkStats.videoBytesReceived = videoBytesReceived;
7364
+ networkStats.transportSent = transportSent;
7365
+ networkStats.transportReceived = transportReceived;
7366
+
7367
+ const bandwidth = (networkStats.audioBytesSent - lastAudioSent) + (networkStats.videoBytesSent - lastVideoSent)
7368
+ + (networkStats.audioBytesReceived - lastAudioReceived) + (networkStats.videoBytesReceived - lastVideoReceived)
7369
+ + (networkStats.transportReceived - lastTransportReceived) + (networkStats.transportSent - lastTransportSent);
7318
7370
 
7319
- networkStats.bandwidth = (networkStats.audioBytesSent - lastAudioSent)
7320
- + (networkStats.videoBytesSent - lastVideoSent) + (networkStats.audioBytesReceived - lastAudioReceived)
7321
- + (networkStats.videoBytesReceived - lastVideoReceived);
7371
+ networkStats.bandwidth = bandwidth;
7322
7372
 
7323
7373
  this.eventEmitter.emit(ON_NETWORK_STATS, session, networkStats, this.sessionNetworkStats[sessionId]);
7324
7374
  this.sessionNetworkStats[sessionId].push(networkStats);
package/lib/api/agentd.js CHANGED
@@ -384,7 +384,7 @@ class IssueReporter {
384
384
  payload._retry = retry + 1;
385
385
  }
386
386
 
387
- this._sendDebugToGrafana(body, retry + 1);
387
+ this._sendDebugToGrafana(payload, retry + 1);
388
388
  }, 5000 + retry * 1000);
389
389
  });
390
390
  }
package/lib/api/amid.js CHANGED
@@ -323,7 +323,7 @@ class IssueReporter {
323
323
  payload._retry = retry + 1;
324
324
  }
325
325
 
326
- this._sendDebugToGrafana(body, retry + 1);
326
+ this._sendDebugToGrafana(payload, retry + 1);
327
327
  }, 5000 + retry * 1000);
328
328
  });
329
329
  }
@@ -384,7 +384,7 @@ class IssueReporter {
384
384
  payload._retry = retry + 1;
385
385
  }
386
386
 
387
- this._sendDebugToGrafana(body, retry + 1);
387
+ this._sendDebugToGrafana(payload, retry + 1);
388
388
  }, 5000 + retry * 1000);
389
389
  });
390
390
  }
package/lib/api/auth.js CHANGED
@@ -387,7 +387,7 @@ class IssueReporter {
387
387
  payload._retry = retry + 1;
388
388
  }
389
389
 
390
- this._sendDebugToGrafana(body, retry + 1);
390
+ this._sendDebugToGrafana(payload, retry + 1);
391
391
  }, 5000 + retry * 1000);
392
392
  });
393
393
  }
@@ -324,7 +324,7 @@ class IssueReporter {
324
324
  payload._retry = retry + 1;
325
325
  }
326
326
 
327
- this._sendDebugToGrafana(body, retry + 1);
327
+ this._sendDebugToGrafana(payload, retry + 1);
328
328
  }, 5000 + retry * 1000);
329
329
  });
330
330
  }
@@ -426,7 +426,7 @@ class Recording {
426
426
 
427
427
 
428
428
 
429
- static parseMany(recordings ) {
429
+ static parseMany(recordings = []) {
430
430
  return recordings.map(item => Recording.parse(item));
431
431
  }
432
432
 
@@ -552,7 +552,7 @@ class CallLog {
552
552
  duration: (plain.duration || 0) * 1000, // duration is in seconds
553
553
  start: moment__default['default'](plain.start).toDate(),
554
554
  end: plain.end ? moment__default['default'](plain.end).toDate() : null,
555
- recordings: Recording.parseMany(plain.recordings),
555
+ recordings: Recording.parseMany(plain.recordings || []),
556
556
  });
557
557
  }
558
558
 
package/lib/api/calld.js CHANGED
@@ -385,7 +385,7 @@ class IssueReporter {
385
385
  payload._retry = retry + 1;
386
386
  }
387
387
 
388
- this._sendDebugToGrafana(body, retry + 1);
388
+ this._sendDebugToGrafana(payload, retry + 1);
389
389
  }, 5000 + retry * 1000);
390
390
  });
391
391
  }
package/lib/api/chatd.js CHANGED
@@ -384,7 +384,7 @@ class IssueReporter {
384
384
  payload._retry = retry + 1;
385
385
  }
386
386
 
387
- this._sendDebugToGrafana(body, retry + 1);
387
+ this._sendDebugToGrafana(payload, retry + 1);
388
388
  }, 5000 + retry * 1000);
389
389
  });
390
390
  }