Ви не можете вибрати більше 25 тем Теми мають розпочинатися з літери або цифри, можуть містити дефіси (-) і не повинні перевищувати 35 символів.

connectionquality.js 2.7KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. /* global APP, require */
  2. /* jshint -W101 */
  3. import EventEmitter from "events";
  4. import CQEvents from "../../service/connectionquality/CQEvents";
  5. const eventEmitter = new EventEmitter();
  6. /**
  7. * local stats
  8. * @type {{}}
  9. */
  10. var stats = {};
  11. /**
  12. * remote stats
  13. * @type {{}}
  14. */
  15. var remoteStats = {};
  16. /**
  17. * Quality percent( 100% - good, 0% - bad.) for the local user.
  18. */
  19. var localConnectionQuality = 100;
  20. /**
  21. * Quality percent( 100% - good, 0% - bad.) stored per id.
  22. */
  23. var remoteConnectionQuality = {};
  24. /**
  25. * Calculates the quality percent based on passed new and old value.
  26. * @param newVal the new value
  27. * @param oldVal the old value
  28. */
  29. function calculateQuality(newVal, oldVal) {
  30. return (newVal <= oldVal) ? newVal : (9*oldVal + newVal) / 10;
  31. }
  32. export default {
  33. /**
  34. * Updates the local statistics
  35. * @param data new statistics
  36. * @param dontUpdateLocalConnectionQuality {boolean} if true -
  37. * localConnectionQuality wont be recalculated.
  38. */
  39. updateLocalStats: function (data, dontUpdateLocalConnectionQuality) {
  40. stats = data;
  41. if(!dontUpdateLocalConnectionQuality) {
  42. var newVal = 100 - stats.packetLoss.total;
  43. localConnectionQuality =
  44. calculateQuality(newVal, localConnectionQuality);
  45. }
  46. eventEmitter.emit(CQEvents.LOCALSTATS_UPDATED, localConnectionQuality,
  47. stats);
  48. },
  49. /**
  50. * Updates only the localConnectionQuality value
  51. * @param values {int} the new value. should be from 0 - 100.
  52. */
  53. updateLocalConnectionQuality: function (value) {
  54. localConnectionQuality = value;
  55. eventEmitter.emit(CQEvents.LOCALSTATS_UPDATED, localConnectionQuality,
  56. stats);
  57. },
  58. /**
  59. * Updates remote statistics
  60. * @param id the id associated with the statistics
  61. * @param data the statistics
  62. */
  63. updateRemoteStats: function (id, data) {
  64. if (!data || !("packetLoss" in data) || !("total" in data.packetLoss)) {
  65. eventEmitter.emit(CQEvents.REMOTESTATS_UPDATED, id, null, null);
  66. return;
  67. }
  68. // Use only the fields we need
  69. data = {bitrate: data.bitrate, packetLoss: data.packetLoss};
  70. remoteStats[id] = data;
  71. var newVal = 100 - data.packetLoss.total;
  72. var oldVal = remoteConnectionQuality[id];
  73. remoteConnectionQuality[id] = calculateQuality(newVal, oldVal || 100);
  74. eventEmitter.emit(
  75. CQEvents.REMOTESTATS_UPDATED, id, remoteConnectionQuality[id],
  76. remoteStats[id]);
  77. },
  78. /**
  79. * Returns the local statistics.
  80. */
  81. getStats: function () {
  82. return stats;
  83. },
  84. addListener: function (type, listener) {
  85. eventEmitter.on(type, listener);
  86. }
  87. };