@wazo/sdk 0.37.15 → 0.37.19

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 +3 -3
  2. package/esm/__tests__/api-client.test.js +9 -5
  3. package/esm/__tests__/web-rtc-client.test.js +117 -23
  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 +117 -23
  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 +117 -23
  20. package/esm/checker/checks/wazo-websocket.js +1 -1
  21. package/esm/checker/checks/webrtc-transport.js +117 -23
  22. package/esm/checker/checks/webrtc.js +117 -23
  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 +125 -23
  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 +125 -23
  38. package/esm/simple/Configuration.js +125 -23
  39. package/esm/simple/Directory.js +9 -5
  40. package/esm/simple/Phone.js +125 -23
  41. package/esm/simple/Websocket.js +1 -1
  42. package/esm/simple/index.js +125 -23
  43. package/esm/simple/room/LocalParticipant.js +125 -23
  44. package/esm/simple/room/Participant.js +125 -23
  45. package/esm/simple/room/RemoteParticipant.js +125 -23
  46. package/esm/simple/room/Room.js +125 -23
  47. package/esm/simple/room/SipRoom.js +125 -23
  48. package/esm/simple/room/Stream.js +125 -23
  49. package/esm/simple/room/__tests__/RemoteParticipant.test.js +125 -23
  50. package/esm/simple/utils.js +125 -23
  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 +117 -23
  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 +117 -23
  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 +117 -23
  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 +117 -23
  73. package/lib/checker/checks/wazo-websocket.js +1 -1
  74. package/lib/checker/checks/webrtc-transport.js +117 -23
  75. package/lib/checker/checks/webrtc.js +117 -23
  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 +125 -23
  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 +125 -23
  91. package/lib/simple/Configuration.js +125 -23
  92. package/lib/simple/Directory.js +9 -5
  93. package/lib/simple/Phone.js +125 -23
  94. package/lib/simple/Websocket.js +1 -1
  95. package/lib/simple/index.js +125 -23
  96. package/lib/simple/room/LocalParticipant.js +125 -23
  97. package/lib/simple/room/Participant.js +125 -23
  98. package/lib/simple/room/RemoteParticipant.js +125 -23
  99. package/lib/simple/room/Room.js +125 -23
  100. package/lib/simple/room/SipRoom.js +125 -23
  101. package/lib/simple/room/Stream.js +125 -23
  102. package/lib/simple/room/__tests__/RemoteParticipant.test.js +125 -23
  103. package/lib/simple/utils.js +125 -23
  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 +117 -23
  107. package/lib/websocket-client.js +1 -1
  108. package/package.json +1 -1
  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 +108 -18
@@ -382,7 +382,7 @@ class IssueReporter {
382
382
  payload._retry = retry + 1;
383
383
  }
384
384
 
385
- this._sendDebugToGrafana(body, retry + 1);
385
+ this._sendDebugToGrafana(payload, retry + 1);
386
386
  }, 5000 + retry * 1000);
387
387
  });
388
388
  }
@@ -2585,7 +2585,8 @@ class ExternalApp {
2585
2585
 
2586
2586
 
2587
2587
 
2588
-
2588
+
2589
+
2589
2590
 
2590
2591
 
2591
2592
  class Meeting {
@@ -2597,6 +2598,7 @@ class Meeting {
2597
2598
 
2598
2599
 
2599
2600
 
2601
+
2600
2602
 
2601
2603
 
2602
2604
  static parse(plain ) {
@@ -2608,6 +2610,7 @@ class Meeting {
2608
2610
  port: plain.port,
2609
2611
  uuid: plain.uuid,
2610
2612
  number: plain.number,
2613
+ persistent: plain.persistent,
2611
2614
  });
2612
2615
  }
2613
2616
 
@@ -2615,7 +2618,7 @@ class Meeting {
2615
2618
  return newFrom(meeting, Meeting);
2616
2619
  }
2617
2620
 
2618
- constructor({ uuid, name, guestSipAuthorization, ownerUuids, port, uri, number } = {}) {
2621
+ constructor({ uuid, name, guestSipAuthorization, ownerUuids, port, uri, number, persistent } = {}) {
2619
2622
  this.guestSipAuthorization = guestSipAuthorization;
2620
2623
  this.uri = uri;
2621
2624
  this.name = name;
@@ -2623,6 +2626,7 @@ class Meeting {
2623
2626
  this.port = port;
2624
2627
  this.uuid = uuid;
2625
2628
  this.number = number;
2629
+ this.persistent = persistent;
2626
2630
 
2627
2631
  // Useful to compare instead of instanceof with minified code
2628
2632
  this.type = 'Meeting';
@@ -3186,7 +3190,7 @@ class Recording {
3186
3190
 
3187
3191
 
3188
3192
 
3189
- static parseMany(recordings ) {
3193
+ static parseMany(recordings = []) {
3190
3194
  return recordings.map(item => Recording.parse(item));
3191
3195
  }
3192
3196
 
@@ -3312,7 +3316,7 @@ class CallLog {
3312
3316
  duration: (plain.duration || 0) * 1000, // duration is in seconds
3313
3317
  start: moment(plain.start).toDate(),
3314
3318
  end: plain.end ? moment(plain.end).toDate() : null,
3315
- recordings: Recording.parseMany(plain.recordings),
3319
+ recordings: Recording.parseMany(plain.recordings || []),
3316
3320
  });
3317
3321
  }
3318
3322
 
@@ -18,7 +18,8 @@ var newFrom = (instance , ToClass ) => {
18
18
 
19
19
 
20
20
 
21
-
21
+
22
+
22
23
 
23
24
 
24
25
  class Meeting {
@@ -30,6 +31,7 @@ class Meeting {
30
31
 
31
32
 
32
33
 
34
+
33
35
 
34
36
 
35
37
  static parse(plain ) {
@@ -41,6 +43,7 @@ class Meeting {
41
43
  port: plain.port,
42
44
  uuid: plain.uuid,
43
45
  number: plain.number,
46
+ persistent: plain.persistent,
44
47
  });
45
48
  }
46
49
 
@@ -48,7 +51,7 @@ class Meeting {
48
51
  return newFrom(meeting, Meeting);
49
52
  }
50
53
 
51
- constructor({ uuid, name, guestSipAuthorization, ownerUuids, port, uri, number } = {}) {
54
+ constructor({ uuid, name, guestSipAuthorization, ownerUuids, port, uri, number, persistent } = {}) {
52
55
  this.guestSipAuthorization = guestSipAuthorization;
53
56
  this.uri = uri;
54
57
  this.name = name;
@@ -56,6 +59,7 @@ class Meeting {
56
59
  this.port = port;
57
60
  this.uuid = uuid;
58
61
  this.number = number;
62
+ this.persistent = persistent;
59
63
 
60
64
  // Useful to compare instead of instanceof with minified code
61
65
  this.type = 'Meeting';
@@ -2092,7 +2092,7 @@ class Recording {
2092
2092
 
2093
2093
 
2094
2094
 
2095
- static parseMany(recordings ) {
2095
+ static parseMany(recordings = []) {
2096
2096
  return recordings.map(item => Recording.parse(item));
2097
2097
  }
2098
2098
 
@@ -2218,7 +2218,7 @@ class CallLog {
2218
2218
  duration: (plain.duration || 0) * 1000, // duration is in seconds
2219
2219
  start: moment(plain.start).toDate(),
2220
2220
  end: plain.end ? moment(plain.end).toDate() : null,
2221
- recordings: Recording.parseMany(plain.recordings),
2221
+ recordings: Recording.parseMany(plain.recordings || []),
2222
2222
  });
2223
2223
  }
2224
2224
 
@@ -2762,7 +2762,7 @@ class IssueReporter {
2762
2762
  payload._retry = retry + 1;
2763
2763
  }
2764
2764
 
2765
- this._sendDebugToGrafana(body, retry + 1);
2765
+ this._sendDebugToGrafana(payload, retry + 1);
2766
2766
  }, 5000 + retry * 1000);
2767
2767
  });
2768
2768
  }
@@ -3480,7 +3480,8 @@ class ExternalApp {
3480
3480
 
3481
3481
 
3482
3482
 
3483
-
3483
+
3484
+
3484
3485
 
3485
3486
 
3486
3487
  class Meeting {
@@ -3492,6 +3493,7 @@ class Meeting {
3492
3493
 
3493
3494
 
3494
3495
 
3496
+
3495
3497
 
3496
3498
 
3497
3499
  static parse(plain ) {
@@ -3503,6 +3505,7 @@ class Meeting {
3503
3505
  port: plain.port,
3504
3506
  uuid: plain.uuid,
3505
3507
  number: plain.number,
3508
+ persistent: plain.persistent,
3506
3509
  });
3507
3510
  }
3508
3511
 
@@ -3510,7 +3513,7 @@ class Meeting {
3510
3513
  return newFrom(meeting, Meeting);
3511
3514
  }
3512
3515
 
3513
- constructor({ uuid, name, guestSipAuthorization, ownerUuids, port, uri, number } = {}) {
3516
+ constructor({ uuid, name, guestSipAuthorization, ownerUuids, port, uri, number, persistent } = {}) {
3514
3517
  this.guestSipAuthorization = guestSipAuthorization;
3515
3518
  this.uri = uri;
3516
3519
  this.name = name;
@@ -3518,6 +3521,7 @@ class Meeting {
3518
3521
  this.port = port;
3519
3522
  this.uuid = uuid;
3520
3523
  this.number = number;
3524
+ this.persistent = persistent;
3521
3525
 
3522
3526
  // Useful to compare instead of instanceof with minified code
3523
3527
  this.type = 'Meeting';
@@ -739,7 +739,7 @@ class IssueReporter {
739
739
  payload._retry = retry + 1;
740
740
  }
741
741
 
742
- this._sendDebugToGrafana(body, retry + 1);
742
+ this._sendDebugToGrafana(payload, retry + 1);
743
743
  }, 5000 + retry * 1000);
744
744
  });
745
745
  }
@@ -877,6 +877,7 @@ const ON_MESSAGE_TRACK_UPDATED = 'onTrackUpdated';
877
877
  const ON_NETWORK_STATS = 'onNetworkStats';
878
878
  const ON_CHAT = 'phone/ON_CHAT';
879
879
  const ON_SIGNAL = 'phone/ON_SIGNAL';
880
+ const ON_DISCONNECTED = 'onDisconnected';
880
881
 
881
882
  const MESSAGE_TYPE_CHAT = 'message/TYPE_CHAT';
882
883
  const MESSAGE_TYPE_SIGNAL = 'message/TYPE_SIGNAL';
@@ -916,6 +917,7 @@ const events = [
916
917
  ON_CHAT,
917
918
  ON_SIGNAL,
918
919
  ON_NETWORK_STATS,
920
+ ON_DISCONNECTED,
919
921
  ];
920
922
 
921
923
  const logger = IssueReporter$1.loggerFor('webrtc-phone');
@@ -2268,6 +2270,11 @@ class WebRTCPhone extends Emitter {
2268
2270
  this.eventEmitter.emit(ON_UNREGISTERED);
2269
2271
  });
2270
2272
 
2273
+ this.client.on(this.client.ON_DISCONNECTED, () => {
2274
+ logger.info('WebRTC disconnected');
2275
+ this.eventEmitter.emit(ON_DISCONNECTED);
2276
+ });
2277
+
2271
2278
  this.client.on(this.client.REGISTERED, () => {
2272
2279
  logger.info('WebRTC registered', {
2273
2280
  shouldSendReinvite: this.shouldSendReinvite,
@@ -2484,4 +2491,4 @@ class WebRTCPhone extends Emitter {
2484
2491
  }
2485
2492
 
2486
2493
  export default WebRTCPhone;
2487
- export { MESSAGE_TYPE_CHAT, MESSAGE_TYPE_SIGNAL, ON_AUDIO_STREAM, ON_CALL_ACCEPTED, ON_CALL_ANSWERED, ON_CALL_CANCELED, ON_CALL_ENDED, ON_CALL_ENDING, ON_CALL_ERROR, ON_CALL_FAILED, ON_CALL_HELD, ON_CALL_INCOMING, ON_CALL_MUTED, ON_CALL_OUTGOING, ON_CALL_RESUMED, ON_CALL_UNHELD, ON_CALL_UNMUTED, ON_CAMERA_DISABLED, ON_CAMERA_RESUMED, ON_CHAT, ON_MESSAGE, ON_MESSAGE_TRACK_UPDATED, ON_NETWORK_STATS, ON_PLAY_HANGUP_SOUND, ON_PLAY_INBOUND_CALL_SIGNAL_SOUND, ON_PLAY_PROGRESS_SOUND, ON_PLAY_RING_SOUND, ON_PROGRESS, ON_REGISTERED, ON_REINVITE, ON_REMOVE_STREAM, ON_SHARE_SCREEN_ENDED, ON_SHARE_SCREEN_ENDING, ON_SHARE_SCREEN_STARTED, ON_SIGNAL, ON_TERMINATE_SOUND, ON_TRACK, ON_UNREGISTERED, ON_USER_AGENT, ON_VIDEO_INPUT_CHANGE, ON_VIDEO_STREAM, events };
2494
+ export { MESSAGE_TYPE_CHAT, MESSAGE_TYPE_SIGNAL, ON_AUDIO_STREAM, ON_CALL_ACCEPTED, ON_CALL_ANSWERED, ON_CALL_CANCELED, ON_CALL_ENDED, ON_CALL_ENDING, ON_CALL_ERROR, ON_CALL_FAILED, ON_CALL_HELD, ON_CALL_INCOMING, ON_CALL_MUTED, ON_CALL_OUTGOING, ON_CALL_RESUMED, ON_CALL_UNHELD, ON_CALL_UNMUTED, ON_CAMERA_DISABLED, ON_CAMERA_RESUMED, ON_CHAT, ON_DISCONNECTED, ON_MESSAGE, ON_MESSAGE_TRACK_UPDATED, ON_NETWORK_STATS, ON_PLAY_HANGUP_SOUND, ON_PLAY_INBOUND_CALL_SIGNAL_SOUND, ON_PLAY_PROGRESS_SOUND, ON_PLAY_RING_SOUND, ON_PROGRESS, ON_REGISTERED, ON_REINVITE, ON_REMOVE_STREAM, ON_SHARE_SCREEN_ENDED, ON_SHARE_SCREEN_ENDING, ON_SHARE_SCREEN_STARTED, ON_SIGNAL, ON_TERMINATE_SOUND, ON_TRACK, ON_UNREGISTERED, ON_USER_AGENT, ON_VIDEO_INPUT_CHANGE, ON_VIDEO_STREAM, events };
@@ -25,7 +25,7 @@ class Recording {
25
25
 
26
26
 
27
27
 
28
- static parseMany(recordings ) {
28
+ static parseMany(recordings = []) {
29
29
  return recordings.map(item => Recording.parse(item));
30
30
  }
31
31
 
@@ -53,7 +53,7 @@ class Recording {
53
53
 
54
54
 
55
55
 
56
- static parseMany(recordings ) {
56
+ static parseMany(recordings = []) {
57
57
  return recordings.map(item => Recording.parse(item));
58
58
  }
59
59
 
@@ -179,7 +179,7 @@ class CallLog {
179
179
  duration: (plain.duration || 0) * 1000, // duration is in seconds
180
180
  start: moment(plain.start).toDate(),
181
181
  end: plain.end ? moment(plain.end).toDate() : null,
182
- recordings: Recording.parseMany(plain.recordings),
182
+ recordings: Recording.parseMany(plain.recordings || []),
183
183
  });
184
184
  }
185
185
 
package/esm/index.js CHANGED
@@ -402,7 +402,7 @@ class IssueReporter {
402
402
  payload._retry = retry + 1;
403
403
  }
404
404
 
405
- this._sendDebugToGrafana(body, retry + 1);
405
+ this._sendDebugToGrafana(payload, retry + 1);
406
406
  }, 5000 + retry * 1000);
407
407
  });
408
408
  }
@@ -2605,7 +2605,8 @@ class ExternalApp {
2605
2605
 
2606
2606
 
2607
2607
 
2608
-
2608
+
2609
+
2609
2610
 
2610
2611
 
2611
2612
  class Meeting {
@@ -2617,6 +2618,7 @@ class Meeting {
2617
2618
 
2618
2619
 
2619
2620
 
2621
+
2620
2622
 
2621
2623
 
2622
2624
  static parse(plain ) {
@@ -2628,6 +2630,7 @@ class Meeting {
2628
2630
  port: plain.port,
2629
2631
  uuid: plain.uuid,
2630
2632
  number: plain.number,
2633
+ persistent: plain.persistent,
2631
2634
  });
2632
2635
  }
2633
2636
 
@@ -2635,7 +2638,7 @@ class Meeting {
2635
2638
  return newFrom(meeting, Meeting);
2636
2639
  }
2637
2640
 
2638
- constructor({ uuid, name, guestSipAuthorization, ownerUuids, port, uri, number } = {}) {
2641
+ constructor({ uuid, name, guestSipAuthorization, ownerUuids, port, uri, number, persistent } = {}) {
2639
2642
  this.guestSipAuthorization = guestSipAuthorization;
2640
2643
  this.uri = uri;
2641
2644
  this.name = name;
@@ -2643,6 +2646,7 @@ class Meeting {
2643
2646
  this.port = port;
2644
2647
  this.uuid = uuid;
2645
2648
  this.number = number;
2649
+ this.persistent = persistent;
2646
2650
 
2647
2651
  // Useful to compare instead of instanceof with minified code
2648
2652
  this.type = 'Meeting';
@@ -3577,7 +3581,7 @@ class Recording {
3577
3581
 
3578
3582
 
3579
3583
 
3580
- static parseMany(recordings ) {
3584
+ static parseMany(recordings = []) {
3581
3585
  return recordings.map(item => Recording.parse(item));
3582
3586
  }
3583
3587
 
@@ -3703,7 +3707,7 @@ class CallLog {
3703
3707
  duration: (plain.duration || 0) * 1000, // duration is in seconds
3704
3708
  start: moment(plain.start).toDate(),
3705
3709
  end: plain.end ? moment(plain.end).toDate() : null,
3706
- recordings: Recording.parseMany(plain.recordings),
3710
+ recordings: Recording.parseMany(plain.recordings || []),
3707
3711
  });
3708
3712
  }
3709
3713
 
@@ -6109,6 +6113,7 @@ const ON_REINVITE$1 = 'reinvite';
6109
6113
  const ON_ERROR = 'onError';
6110
6114
  const ON_SCREEN_SHARING_REINVITE = 'onScreenSharingReinvite';
6111
6115
  const ON_NETWORK_STATS$1 = 'onNetworkStats';
6116
+ const ON_DISCONNECTED$1 = 'onDisconnected';
6112
6117
 
6113
6118
  const events$1 = [REGISTERED, UNREGISTERED, REGISTRATION_FAILED, INVITE];
6114
6119
  const transportEvents = [CONNECTED, DISCONNECTED, TRANSPORT_ERROR, MESSAGE];
@@ -6185,6 +6190,7 @@ class WebRTCClient extends Emitter {
6185
6190
 
6186
6191
 
6187
6192
 
6193
+
6188
6194
 
6189
6195
  static isAPrivateIp(ip ) {
6190
6196
  const regex = /^(?:10|127|172\.(?:1[6-9]|2[0-9]|3[01])|192\.168)\..*/;
@@ -6250,6 +6256,7 @@ class WebRTCClient extends Emitter {
6250
6256
  this.ON_ERROR = ON_ERROR;
6251
6257
  this.ON_SCREEN_SHARING_REINVITE = ON_SCREEN_SHARING_REINVITE;
6252
6258
  this.ON_NETWORK_STATS = ON_NETWORK_STATS$1;
6259
+ this.ON_DISCONNECTED = ON_DISCONNECTED$1;
6253
6260
  }
6254
6261
 
6255
6262
  configureMedia(media ) {
@@ -6851,7 +6858,7 @@ class WebRTCClient extends Emitter {
6851
6858
  // We search for the last transceiver without `video-` in the mid (video- means remote transceiver)
6852
6859
  const transceivers = pc.getTransceivers();
6853
6860
  const transceiverIdx = lastIndexOf(transceivers, transceiver =>
6854
- transceiver.sender.track === null && transceiver.mid.indexOf('video') === -1);
6861
+ transceiver.sender.track === null && transceiver.mid && transceiver.mid.indexOf('video') === -1);
6855
6862
 
6856
6863
  videoSender = transceiverIdx !== -1 ? transceivers[transceiverIdx].sender : null;
6857
6864
  } else {
@@ -7097,10 +7104,13 @@ class WebRTCClient extends Emitter {
7097
7104
  return null;
7098
7105
  }
7099
7106
 
7100
- // let's update the local value
7101
- if (this.audio && this.audio.deviceId) {
7102
- // $FlowFixMe
7103
- this.audio.deviceId.exact = id;
7107
+ // let's update the local audio value
7108
+ if (this.audio) {
7109
+ this.audio = {
7110
+ deviceId: {
7111
+ exact: id,
7112
+ },
7113
+ };
7104
7114
  }
7105
7115
 
7106
7116
  if (session) {
@@ -7113,6 +7123,9 @@ class WebRTCClient extends Emitter {
7113
7123
  const sender = pc && pc.getSenders().find(s => audioTrack && s && s.track && s.track.kind === audioTrack.kind);
7114
7124
 
7115
7125
  if (sender) {
7126
+ if (sender.track) {
7127
+ audioTrack.enabled = sender.track.enabled;
7128
+ }
7116
7129
  sender.replaceTrack(audioTrack);
7117
7130
  }
7118
7131
 
@@ -7137,7 +7150,7 @@ class WebRTCClient extends Emitter {
7137
7150
  return null;
7138
7151
  }
7139
7152
 
7140
- // let's update the local value
7153
+ // let's update the local video value
7141
7154
  if (this.video) {
7142
7155
  this.video = {
7143
7156
  deviceId: {
@@ -7172,12 +7185,21 @@ class WebRTCClient extends Emitter {
7172
7185
  return navigator.mediaDevices.getUserMedia(constraints).then(async stream => {
7173
7186
  const videoTrack = stream.getVideoTracks()[0];
7174
7187
  let sender = pc && pc.getSenders().find(s => videoTrack && s && s.track && s.track.kind === videoTrack.kind);
7188
+ let wasTrackEnabled = false;
7175
7189
  if (!sender) {
7176
7190
  sender = pc && pc.getSenders().find(s => !s.track);
7177
7191
  }
7178
7192
 
7179
7193
  if (sender) {
7180
- sender.replaceTrack(videoTrack);
7194
+ // No video track means video not enabled
7195
+ wasTrackEnabled = sender.track ? sender.track.enabled : false;
7196
+ videoTrack.enabled = wasTrackEnabled;
7197
+
7198
+ if (!wasTrackEnabled) {
7199
+ videoTrack.stop();
7200
+ }
7201
+
7202
+ sender.replaceTrack(wasTrackEnabled ? videoTrack : null);
7181
7203
  }
7182
7204
 
7183
7205
  // let's update the local stream
@@ -7861,6 +7883,7 @@ class WebRTCClient extends Emitter {
7861
7883
 
7862
7884
  this.updateRemoteStream(this.getSipSessionId(session));
7863
7885
 
7886
+ const pc = session.sessionDescriptionHandler.peerConnection;
7864
7887
  const onTrack = (event ) => {
7865
7888
  const isAudioOnly = this._isAudioOnly(session);
7866
7889
  const { kind, label, readyState, id, muted } = event.track;
@@ -7880,6 +7903,12 @@ class WebRTCClient extends Emitter {
7880
7903
 
7881
7904
  session.sessionDescriptionHandler.remoteMediaStream.onaddtrack = onTrack;
7882
7905
 
7906
+ pc.oniceconnectionstatechange = () => {
7907
+ if (pc.iceConnectionState === 'disconnected') {
7908
+ this.eventEmitter.emit(ON_DISCONNECTED$1);
7909
+ }
7910
+ };
7911
+
7883
7912
  if (withEvent) {
7884
7913
  this.eventEmitter.emit(ACCEPTED, session, sessionDialog);
7885
7914
  }
@@ -8075,24 +8104,89 @@ class WebRTCClient extends Emitter {
8075
8104
  const session = this.getSipSession(sessionId);
8076
8105
 
8077
8106
  const stats = session ? await this.getStats(session) : null;
8078
- if (!stats) {
8107
+ if (!stats || !(sessionId in this.sessionNetworkStats)) {
8079
8108
  return;
8080
8109
  }
8081
8110
 
8082
- stats.forEach(report => {
8083
- if (report.type === 'inbound-rtp') {
8084
- if (report.kind === 'audio') {
8085
- const networkStats = {
8086
- packetsLost: report.packetsLost,
8087
- packetsReceived: report.packetsReceived,
8088
- jitter: report.jitter,
8089
- };
8111
+ const networkStats = {
8112
+ audioBytesSent: 0,
8113
+ videoBytesSent: 0,
8114
+ videoBytesReceived: 0,
8115
+ audioBytesReceived: 0,
8116
+ };
8117
+ const nbStats = this.sessionNetworkStats[sessionId].length;
8118
+ const lastNetworkStats = this.sessionNetworkStats[sessionId][nbStats - 1];
8119
+ const lastAudioSent = lastNetworkStats ? lastNetworkStats.audioBytesSent : 0;
8120
+ const lastVideoSent = lastNetworkStats ? lastNetworkStats.videoBytesSent : 0;
8121
+ const lastAudioReceived = lastNetworkStats ? lastNetworkStats.audioBytesReceived : 0;
8122
+ const lastVideoReceived = lastNetworkStats ? lastNetworkStats.videoBytesReceived : 0;
8123
+ const lastTransportSent = lastNetworkStats ? lastNetworkStats.transportSent : 0;
8124
+ const lastTransportReceived = lastNetworkStats ? lastNetworkStats.transportReceived : 0;
8125
+ let audioBytesSent = 0;
8126
+ let audioBytesReceived = 0;
8127
+ let videoBytesSent = 0;
8128
+ let videoBytesReceived = 0;
8129
+ let transportSent = 0;
8130
+ let transportReceived = 0;
8131
+ let packetsLost = 0;
8090
8132
 
8091
- this.eventEmitter.emit(ON_NETWORK_STATS$1, session, networkStats, this.sessionNetworkStats[sessionId]);
8092
- this.sessionNetworkStats[sessionId].push(networkStats);
8133
+ stats.forEach(report => {
8134
+ if (report.type === 'outbound-rtp' && report.kind === 'audio') {
8135
+ audioBytesSent += report.bytesSent + report.headerBytesSent;
8136
+ }
8137
+ if (report.type === 'remote-outbound-rtp' && report.kind === 'audio') {
8138
+ audioBytesSent += report.bytesSent;
8139
+ }
8140
+ if (report.type === 'outbound-rtp' && report.kind === 'video') {
8141
+ videoBytesSent += report.bytesSent + report.headerBytesSent;
8142
+ }
8143
+ if (report.type === 'inbound-rtp' && report.kind === 'audio') {
8144
+ packetsLost += report.packetsLost;
8145
+ networkStats.packetsReceived = report.packetsReceived;
8146
+ audioBytesReceived += report.bytesReceived + report.headerBytesReceived;
8147
+ }
8148
+ if (report.type === 'inbound-rtp' && report.kind === 'video') {
8149
+ videoBytesReceived += report.bytesReceived + report.headerBytesReceived;
8150
+ }
8151
+ if (report.type === 'outbound-rtp' && report.kind === 'video') {
8152
+ if ('framesPerSecond' in report) {
8153
+ networkStats.framesPerSecond = report.framesPerSecond;
8154
+ }
8155
+ if ('framerateMean' in report) {
8156
+ // framerateMean is only available in FF
8157
+ networkStats.framesPerSecond = Math.round(report.framerateMean);
8093
8158
  }
8094
8159
  }
8160
+ if (report.type === 'remote-inbound-rtp' && report.kind === 'audio') {
8161
+ packetsLost += report.packetsLost;
8162
+ networkStats.roundTripTime = report.roundTripTime;
8163
+ networkStats.jitter = report.jitter;
8164
+ }
8165
+ if (report.type === 'remote-inbound-rtp' && report.kind === 'video') {
8166
+ packetsLost += report.packetsLost;
8167
+ }
8168
+ if (report.type === 'transport') {
8169
+ transportSent += report.bytesSent;
8170
+ transportReceived += report.bytesReceived;
8171
+ }
8095
8172
  });
8173
+
8174
+ networkStats.packetsLost = packetsLost;
8175
+ networkStats.audioBytesSent = audioBytesSent;
8176
+ networkStats.audioBytesReceived = audioBytesReceived;
8177
+ networkStats.videoBytesSent = videoBytesSent;
8178
+ networkStats.videoBytesReceived = videoBytesReceived;
8179
+ networkStats.transportSent = transportSent;
8180
+ networkStats.transportReceived = transportReceived;
8181
+
8182
+ const bandwidth = (networkStats.audioBytesSent - lastAudioSent) + (networkStats.videoBytesSent - lastVideoSent)
8183
+ + (networkStats.audioBytesReceived - lastAudioReceived) + (networkStats.videoBytesReceived - lastVideoReceived)
8184
+ + (networkStats.transportReceived - lastTransportReceived) + (networkStats.transportSent - lastTransportSent);
8185
+
8186
+ networkStats.bandwidth = bandwidth;
8187
+
8188
+ this.eventEmitter.emit(ON_NETWORK_STATS$1, session, networkStats, this.sessionNetworkStats[sessionId]);
8189
+ this.sessionNetworkStats[sessionId].push(networkStats);
8096
8190
  }
8097
8191
 
8098
8192
  }
@@ -9028,6 +9122,7 @@ const ON_MESSAGE_TRACK_UPDATED = 'onTrackUpdated';
9028
9122
  const ON_NETWORK_STATS = 'onNetworkStats';
9029
9123
  const ON_CHAT = 'phone/ON_CHAT';
9030
9124
  const ON_SIGNAL = 'phone/ON_SIGNAL';
9125
+ const ON_DISCONNECTED = 'onDisconnected';
9031
9126
 
9032
9127
  const MESSAGE_TYPE_CHAT = 'message/TYPE_CHAT';
9033
9128
  const MESSAGE_TYPE_SIGNAL = 'message/TYPE_SIGNAL';
@@ -9067,6 +9162,7 @@ const events = [
9067
9162
  ON_CHAT,
9068
9163
  ON_SIGNAL,
9069
9164
  ON_NETWORK_STATS,
9165
+ ON_DISCONNECTED,
9070
9166
  ];
9071
9167
 
9072
9168
  const logger$7 = IssueReporter$1.loggerFor('webrtc-phone');
@@ -10419,6 +10515,11 @@ class WebRTCPhone extends Emitter {
10419
10515
  this.eventEmitter.emit(ON_UNREGISTERED);
10420
10516
  });
10421
10517
 
10518
+ this.client.on(this.client.ON_DISCONNECTED, () => {
10519
+ logger$7.info('WebRTC disconnected');
10520
+ this.eventEmitter.emit(ON_DISCONNECTED);
10521
+ });
10522
+
10422
10523
  this.client.on(this.client.REGISTERED, () => {
10423
10524
  logger$7.info('WebRTC registered', {
10424
10525
  shouldSendReinvite: this.shouldSendReinvite,
@@ -10675,6 +10776,7 @@ var PHONE_EVENTS = /*#__PURE__*/Object.freeze({
10675
10776
  ON_NETWORK_STATS: ON_NETWORK_STATS,
10676
10777
  ON_CHAT: ON_CHAT,
10677
10778
  ON_SIGNAL: ON_SIGNAL,
10779
+ ON_DISCONNECTED: ON_DISCONNECTED,
10678
10780
  MESSAGE_TYPE_CHAT: MESSAGE_TYPE_CHAT,
10679
10781
  MESSAGE_TYPE_SIGNAL: MESSAGE_TYPE_SIGNAL,
10680
10782
  events: events,
@@ -349,7 +349,7 @@ class IssueReporter {
349
349
  payload._retry = retry + 1;
350
350
  }
351
351
 
352
- this._sendDebugToGrafana(body, retry + 1);
352
+ this._sendDebugToGrafana(payload, retry + 1);
353
353
  }, 5000 + retry * 1000);
354
354
  });
355
355
  }
@@ -1705,7 +1705,7 @@ class Recording {
1705
1705
 
1706
1706
 
1707
1707
 
1708
- static parseMany(recordings ) {
1708
+ static parseMany(recordings = []) {
1709
1709
  return recordings.map(item => Recording.parse(item));
1710
1710
  }
1711
1711
 
@@ -1831,7 +1831,7 @@ class CallLog {
1831
1831
  duration: (plain.duration || 0) * 1000, // duration is in seconds
1832
1832
  start: moment(plain.start).toDate(),
1833
1833
  end: plain.end ? moment(plain.end).toDate() : null,
1834
- recordings: Recording.parseMany(plain.recordings),
1834
+ recordings: Recording.parseMany(plain.recordings || []),
1835
1835
  });
1836
1836
  }
1837
1837
 
@@ -2391,7 +2391,7 @@ class IssueReporter {
2391
2391
  payload._retry = retry + 1;
2392
2392
  }
2393
2393
 
2394
- this._sendDebugToGrafana(body, retry + 1);
2394
+ this._sendDebugToGrafana(payload, retry + 1);
2395
2395
  }, 5000 + retry * 1000);
2396
2396
  });
2397
2397
  }
@@ -3109,7 +3109,8 @@ class ExternalApp {
3109
3109
 
3110
3110
 
3111
3111
 
3112
-
3112
+
3113
+
3113
3114
 
3114
3115
 
3115
3116
  class Meeting {
@@ -3121,6 +3122,7 @@ class Meeting {
3121
3122
 
3122
3123
 
3123
3124
 
3125
+
3124
3126
 
3125
3127
 
3126
3128
  static parse(plain ) {
@@ -3132,6 +3134,7 @@ class Meeting {
3132
3134
  port: plain.port,
3133
3135
  uuid: plain.uuid,
3134
3136
  number: plain.number,
3137
+ persistent: plain.persistent,
3135
3138
  });
3136
3139
  }
3137
3140
 
@@ -3139,7 +3142,7 @@ class Meeting {
3139
3142
  return newFrom(meeting, Meeting);
3140
3143
  }
3141
3144
 
3142
- constructor({ uuid, name, guestSipAuthorization, ownerUuids, port, uri, number } = {}) {
3145
+ constructor({ uuid, name, guestSipAuthorization, ownerUuids, port, uri, number, persistent } = {}) {
3143
3146
  this.guestSipAuthorization = guestSipAuthorization;
3144
3147
  this.uri = uri;
3145
3148
  this.name = name;
@@ -3147,6 +3150,7 @@ class Meeting {
3147
3150
  this.port = port;
3148
3151
  this.uuid = uuid;
3149
3152
  this.number = number;
3153
+ this.persistent = persistent;
3150
3154
 
3151
3155
  // Useful to compare instead of instanceof with minified code
3152
3156
  this.type = 'Meeting';
@@ -345,7 +345,7 @@ class IssueReporter {
345
345
  payload._retry = retry + 1;
346
346
  }
347
347
 
348
- this._sendDebugToGrafana(body, retry + 1);
348
+ this._sendDebugToGrafana(payload, retry + 1);
349
349
  }, 5000 + retry * 1000);
350
350
  });
351
351
  }
@@ -345,7 +345,7 @@ class IssueReporter {
345
345
  payload._retry = retry + 1;
346
346
  }
347
347
 
348
- this._sendDebugToGrafana(body, retry + 1);
348
+ this._sendDebugToGrafana(payload, retry + 1);
349
349
  }, 5000 + retry * 1000);
350
350
  });
351
351
  }