@observertc/observer-js 0.42.9 → 1.0.1-28c6425.0

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 (279) hide show
  1. package/.prettierrc +6 -6
  2. package/README.md +0 -104
  3. package/lib/ObservedCall.d.ts +66 -42
  4. package/lib/ObservedCall.d.ts.map +1 -1
  5. package/lib/ObservedCall.js +232 -108
  6. package/lib/ObservedCallSummary.d.ts +18 -0
  7. package/lib/ObservedCallSummary.d.ts.map +1 -0
  8. package/lib/ObservedCertificate.d.ts +19 -0
  9. package/lib/ObservedCertificate.d.ts.map +1 -0
  10. package/lib/ObservedCertificate.js +38 -0
  11. package/lib/ObservedClient.d.ts +71 -130
  12. package/lib/ObservedClient.d.ts.map +1 -1
  13. package/lib/ObservedClient.js +311 -750
  14. package/lib/ObservedClientSummary.d.ts +23 -0
  15. package/lib/ObservedClientSummary.d.ts.map +1 -0
  16. package/lib/ObservedClientSummary.js +2 -0
  17. package/lib/ObservedCodec.d.ts +22 -0
  18. package/lib/ObservedCodec.d.ts.map +1 -0
  19. package/lib/ObservedCodec.js +45 -0
  20. package/lib/ObservedDataChannel.d.ts +23 -69
  21. package/lib/ObservedDataChannel.d.ts.map +1 -1
  22. package/lib/ObservedDataChannel.js +67 -109
  23. package/lib/ObservedIceCandidate.d.ts +29 -0
  24. package/lib/ObservedIceCandidate.d.ts.map +1 -0
  25. package/lib/ObservedIceCandidate.js +59 -0
  26. package/lib/ObservedIceCandidatePair.d.ts +44 -0
  27. package/lib/ObservedIceCandidatePair.d.ts.map +1 -0
  28. package/lib/ObservedIceCandidatePair.js +111 -0
  29. package/lib/ObservedIceTransport.d.ts +36 -0
  30. package/lib/ObservedIceTransport.d.ts.map +1 -0
  31. package/lib/ObservedIceTransport.js +93 -0
  32. package/lib/ObservedInboundRtp.d.ts +92 -0
  33. package/lib/ObservedInboundRtp.d.ts.map +1 -0
  34. package/lib/ObservedInboundRtp.js +193 -0
  35. package/lib/ObservedInboundTrack.d.ts +29 -0
  36. package/lib/ObservedInboundTrack.d.ts.map +1 -0
  37. package/lib/ObservedInboundTrack.js +57 -0
  38. package/lib/ObservedMediaPlayout.d.ts +22 -0
  39. package/lib/ObservedMediaPlayout.d.ts.map +1 -0
  40. package/lib/ObservedMediaPlayout.js +42 -0
  41. package/lib/ObservedMediaSource.d.ts +28 -0
  42. package/lib/ObservedMediaSource.d.ts.map +1 -0
  43. package/lib/ObservedMediaSource.js +55 -0
  44. package/lib/ObservedOutboundRtp.d.ts +62 -0
  45. package/lib/ObservedOutboundRtp.d.ts.map +1 -0
  46. package/lib/ObservedOutboundRtp.js +144 -0
  47. package/lib/ObservedOutboundTrack.d.ts +29 -0
  48. package/lib/ObservedOutboundTrack.d.ts.map +1 -0
  49. package/lib/ObservedOutboundTrack.js +57 -0
  50. package/lib/ObservedPeerConnection.d.ts +132 -80
  51. package/lib/ObservedPeerConnection.d.ts.map +1 -1
  52. package/lib/ObservedPeerConnection.js +630 -357
  53. package/lib/ObservedPeerConnectionTransport.d.ts +17 -0
  54. package/lib/ObservedPeerConnectionTransport.d.ts.map +1 -0
  55. package/lib/ObservedPeerConnectionTransport.js +34 -0
  56. package/lib/ObservedRemoteInboundRtp.d.ts +30 -0
  57. package/lib/ObservedRemoteInboundRtp.d.ts.map +1 -0
  58. package/lib/ObservedRemoteInboundRtp.js +60 -0
  59. package/lib/ObservedRemoteOutboundRtp.d.ts +30 -0
  60. package/lib/ObservedRemoteOutboundRtp.d.ts.map +1 -0
  61. package/lib/ObservedRemoteOutboundRtp.js +60 -0
  62. package/lib/ObservedTURN.d.ts +31 -0
  63. package/lib/ObservedTURN.d.ts.map +1 -0
  64. package/lib/ObservedTURN.js +58 -0
  65. package/lib/ObservedTurnServer.d.ts +25 -0
  66. package/lib/ObservedTurnServer.d.ts.map +1 -0
  67. package/lib/ObservedTurnServer.js +59 -0
  68. package/lib/Observer.d.ts +45 -51
  69. package/lib/Observer.d.ts.map +1 -1
  70. package/lib/Observer.js +150 -226
  71. package/lib/ObserverSummary.d.ts +13 -0
  72. package/lib/ObserverSummary.d.ts.map +1 -0
  73. package/lib/ObserverSummary.js +2 -0
  74. package/lib/common/Middleware.d.ts +10 -1
  75. package/lib/common/Middleware.d.ts.map +1 -1
  76. package/lib/common/Middleware.js +55 -36
  77. package/lib/common/logger.d.ts +8 -4
  78. package/lib/common/logger.d.ts.map +1 -1
  79. package/lib/common/logger.js +44 -68
  80. package/lib/common/types.d.ts +0 -21
  81. package/lib/common/types.d.ts.map +1 -1
  82. package/lib/common/types.js +1 -0
  83. package/lib/common/utils.d.ts +2 -1
  84. package/lib/common/utils.d.ts.map +1 -1
  85. package/lib/common/utils.js +17 -3
  86. package/lib/detectors/Detector.d.ts +5 -0
  87. package/lib/detectors/Detector.d.ts.map +1 -0
  88. package/lib/detectors/Detector.js +3 -0
  89. package/lib/detectors/Detectors.d.ts +11 -0
  90. package/lib/detectors/Detectors.d.ts.map +1 -0
  91. package/lib/detectors/Detectors.js +34 -0
  92. package/lib/index.d.ts +24 -25
  93. package/lib/index.d.ts.map +1 -1
  94. package/lib/index.js +41 -41
  95. package/lib/monitors/TurnUsageMonitor.d.ts +0 -52
  96. package/lib/monitors/TurnUsageMonitor.d.ts.map +1 -1
  97. package/lib/monitors/TurnUsageMonitor.js +145 -120
  98. package/lib/schema/ClientEventTypes.d.ts +100 -0
  99. package/lib/schema/ClientEventTypes.d.ts.map +1 -0
  100. package/lib/schema/ClientEventTypes.js +38 -0
  101. package/lib/schema/ClientMetaTypes.d.ts +34 -0
  102. package/lib/schema/ClientMetaTypes.d.ts.map +1 -0
  103. package/lib/schema/ClientMetaTypes.js +16 -0
  104. package/lib/schema/ClientSample.d.ts +1333 -0
  105. package/lib/schema/ClientSample.d.ts.map +1 -0
  106. package/lib/schema/ClientSample.js +4 -0
  107. package/lib/scores/CalculatedScore.d.ts +6 -0
  108. package/lib/scores/CalculatedScore.d.ts.map +1 -0
  109. package/lib/scores/CalculatedScore.js +2 -0
  110. package/lib/scores/DefaultCallScoreCalculator.d.ts +7 -0
  111. package/lib/scores/DefaultCallScoreCalculator.d.ts.map +1 -0
  112. package/lib/scores/DefaultCallScoreCalculator.js +21 -0
  113. package/lib/scores/ScoreCalculator.d.ts +4 -0
  114. package/lib/scores/ScoreCalculator.d.ts.map +1 -0
  115. package/lib/scores/ScoreCalculator.js +2 -0
  116. package/lib/updaters/CallUpdater.d.ts +5 -0
  117. package/lib/updaters/CallUpdater.d.ts.map +1 -0
  118. package/lib/updaters/CallUpdater.js +2 -0
  119. package/lib/updaters/ObserverUpdater.d.ts +5 -0
  120. package/lib/updaters/ObserverUpdater.d.ts.map +1 -0
  121. package/lib/updaters/ObserverUpdater.js +2 -0
  122. package/lib/updaters/OnAllCallObserverUpdater_.d.ts +13 -0
  123. package/lib/updaters/OnAllCallObserverUpdater_.d.ts.map +1 -0
  124. package/lib/updaters/OnAllCallObserverUpdater_.js +38 -0
  125. package/lib/updaters/OnAllClientCallUpdater.d.ts +13 -0
  126. package/lib/updaters/OnAllClientCallUpdater.d.ts.map +1 -0
  127. package/lib/updaters/OnAllClientCallUpdater.js +37 -0
  128. package/lib/updaters/OnAnyCallObserverUpdater_.d.ts +11 -0
  129. package/lib/updaters/OnAnyCallObserverUpdater_.d.ts.map +1 -0
  130. package/lib/updaters/OnAnyCallObserverUpdater_.js +27 -0
  131. package/lib/updaters/OnAnyClientCallUpdater.d.ts +11 -0
  132. package/lib/updaters/OnAnyClientCallUpdater.d.ts.map +1 -0
  133. package/lib/updaters/OnAnyClientCallUpdater.js +27 -0
  134. package/lib/updaters/OnIntervalUpdater.d.ts +10 -0
  135. package/lib/updaters/OnIntervalUpdater.d.ts.map +1 -0
  136. package/lib/updaters/OnIntervalUpdater.js +17 -0
  137. package/lib/updaters/Updater.d.ts +6 -0
  138. package/lib/updaters/Updater.d.ts.map +1 -0
  139. package/lib/updaters/Updater.js +2 -0
  140. package/lib/utils/RemoteTrackResolver.d.ts +7 -0
  141. package/lib/utils/RemoteTrackResolver.d.ts.map +1 -0
  142. package/lib/utils/RemoteTrackResolver.js +2 -0
  143. package/package.json +4 -4
  144. package/src/ObservedCall.ts +291 -164
  145. package/src/ObservedCallSummary.ts +22 -0
  146. package/src/ObservedCertificate.ts +43 -0
  147. package/src/ObservedClient.ts +342 -1064
  148. package/src/ObservedClientSummary.ts +24 -0
  149. package/src/ObservedCodec.ts +49 -0
  150. package/src/ObservedDataChannel.ts +68 -181
  151. package/src/ObservedIceCandidate.ts +64 -0
  152. package/src/ObservedIceCandidatePair.ts +118 -0
  153. package/src/ObservedIceTransport.ts +99 -0
  154. package/src/ObservedInboundRtp.ts +205 -0
  155. package/src/ObservedInboundTrack.ts +70 -0
  156. package/src/ObservedMediaPlayout.ts +49 -0
  157. package/src/ObservedMediaSource.ts +60 -0
  158. package/src/ObservedOutboundRtp.ts +156 -0
  159. package/src/ObservedOutboundTrack.ts +69 -0
  160. package/src/ObservedPeerConnection.ts +839 -408
  161. package/src/ObservedPeerConnectionTransport.ts +38 -0
  162. package/src/ObservedRemoteInboundRtp.ts +64 -0
  163. package/src/ObservedRemoteOutboundRtp.ts +65 -0
  164. package/src/ObservedTURN.ts +86 -0
  165. package/src/ObservedTurnServer.ts +72 -0
  166. package/src/Observer.ts +171 -294
  167. package/src/ObserverSummary.ts +15 -0
  168. package/src/common/Middleware.ts +70 -42
  169. package/src/common/logger.ts +60 -69
  170. package/src/common/types.ts +0 -42
  171. package/src/common/utils.ts +18 -2
  172. package/src/detectors/Detector.ts +6 -0
  173. package/src/detectors/Detectors.ts +38 -0
  174. package/src/index.ts +24 -90
  175. package/src/monitors/TurnUsageMonitor.ts +164 -164
  176. package/src/schema/ClientEventTypes.ts +112 -0
  177. package/src/schema/ClientMetaTypes.ts +41 -0
  178. package/src/schema/ClientSample.ts +1682 -0
  179. package/src/scores/CalculatedScore.ts +6 -0
  180. package/src/scores/DefaultCallScoreCalculator.ts +23 -0
  181. package/src/scores/ScoreCalculator.ts +3 -0
  182. package/src/updaters/CallUpdater.ts +5 -0
  183. package/src/updaters/ObserverUpdater.ts +5 -0
  184. package/src/updaters/OnAllCallObserverUpdater_.ts +46 -0
  185. package/src/updaters/OnAllClientCallUpdater.ts +46 -0
  186. package/src/updaters/OnAnyCallObserverUpdater_.ts +32 -0
  187. package/src/updaters/OnAnyClientCallUpdater.ts +32 -0
  188. package/src/updaters/OnIntervalUpdater.ts +19 -0
  189. package/src/updaters/Updater.ts +5 -0
  190. package/src/utils/RemoteTrackResolver.ts +12 -0
  191. package/tsconfig.json +3 -3
  192. package/lib/ObservedICE.d.ts +0 -64
  193. package/lib/ObservedICE.d.ts.map +0 -1
  194. package/lib/ObservedICE.js +0 -141
  195. package/lib/ObservedInboundAudioTrack.d.ts +0 -96
  196. package/lib/ObservedInboundAudioTrack.d.ts.map +0 -1
  197. package/lib/ObservedInboundAudioTrack.js +0 -217
  198. package/lib/ObservedInboundVideoTrack.d.ts +0 -101
  199. package/lib/ObservedInboundVideoTrack.d.ts.map +0 -1
  200. package/lib/ObservedInboundVideoTrack.js +0 -232
  201. package/lib/ObservedOutboundAudioTrack.d.ts +0 -87
  202. package/lib/ObservedOutboundAudioTrack.d.ts.map +0 -1
  203. package/lib/ObservedOutboundAudioTrack.js +0 -186
  204. package/lib/ObservedOutboundVideoTrack.d.ts +0 -91
  205. package/lib/ObservedOutboundVideoTrack.d.ts.map +0 -1
  206. package/lib/ObservedOutboundVideoTrack.js +0 -193
  207. package/lib/ObservedSfu.d.ts +0 -59
  208. package/lib/ObservedSfu.d.ts.map +0 -1
  209. package/lib/ObservedSfu.js +0 -157
  210. package/lib/ObservedSfuInboundRtpPad.d.ts +0 -42
  211. package/lib/ObservedSfuInboundRtpPad.d.ts.map +0 -1
  212. package/lib/ObservedSfuInboundRtpPad.js +0 -71
  213. package/lib/ObservedSfuOutboundRtpPad.d.ts +0 -42
  214. package/lib/ObservedSfuOutboundRtpPad.d.ts.map +0 -1
  215. package/lib/ObservedSfuOutboundRtpPad.js +0 -72
  216. package/lib/ObservedSfuSctpChannel.d.ts +0 -42
  217. package/lib/ObservedSfuSctpChannel.d.ts.map +0 -1
  218. package/lib/ObservedSfuSctpChannel.js +0 -57
  219. package/lib/ObservedSfuTransport.d.ts +0 -58
  220. package/lib/ObservedSfuTransport.d.ts.map +0 -1
  221. package/lib/ObservedSfuTransport.js +0 -120
  222. package/lib/RemoteTrackAssigner.d.ts +0 -14
  223. package/lib/RemoteTrackAssigner.d.ts.map +0 -1
  224. package/lib/RemoteTrackAssigner.js +0 -52
  225. package/lib/ReportsCollector.d.ts +0 -109
  226. package/lib/ReportsCollector.d.ts.map +0 -1
  227. package/lib/ReportsCollector.js +0 -207
  228. package/lib/common/CalculatedScore.d.ts +0 -80
  229. package/lib/common/CalculatedScore.d.ts.map +0 -1
  230. package/lib/common/CalculatedScore.js +0 -162
  231. package/lib/common/CallEventType.d.ts +0 -63
  232. package/lib/common/CallEventType.d.ts.map +0 -1
  233. package/lib/common/CallEventType.js +0 -39
  234. package/lib/common/CallMetaReports.d.ts +0 -42
  235. package/lib/common/CallMetaReports.d.ts.map +0 -1
  236. package/lib/common/CallMetaReports.js +0 -36
  237. package/lib/common/QualityScoreUtils.d.ts +0 -1
  238. package/lib/common/QualityScoreUtils.d.ts.map +0 -1
  239. package/lib/common/QualityScoreUtils.js +0 -1
  240. package/lib/common/TypedEventEmitter.d.ts +0 -22
  241. package/lib/common/TypedEventEmitter.d.ts.map +0 -1
  242. package/lib/common/TypedEventEmitter.js +0 -11
  243. package/lib/common/callEventReports.d.ts +0 -10
  244. package/lib/common/callEventReports.d.ts.map +0 -1
  245. package/lib/common/callEventReports.js +0 -112
  246. package/lib/monitors/CallSummary.d.ts +0 -37
  247. package/lib/monitors/CallSummary.d.ts.map +0 -1
  248. package/lib/monitors/CallSummaryMonitor.d.ts +0 -32
  249. package/lib/monitors/CallSummaryMonitor.d.ts.map +0 -1
  250. package/lib/monitors/CallSummaryMonitor.js +0 -152
  251. package/lib/monitors/ClientIssueMonitor.d.ts +0 -32
  252. package/lib/monitors/ClientIssueMonitor.d.ts.map +0 -1
  253. package/lib/monitors/ClientIssueMonitor.js +0 -49
  254. package/lib/monitors/SfuServerMonitor.d.ts +0 -79
  255. package/lib/monitors/SfuServerMonitor.d.ts.map +0 -1
  256. package/lib/monitors/SfuServerMonitor.js +0 -198
  257. package/src/ObservedICE.ts +0 -237
  258. package/src/ObservedInboundAudioTrack.ts +0 -344
  259. package/src/ObservedInboundVideoTrack.ts +0 -361
  260. package/src/ObservedOutboundAudioTrack.ts +0 -307
  261. package/src/ObservedOutboundVideoTrack.ts +0 -319
  262. package/src/ObservedSfu.ts +0 -231
  263. package/src/ObservedSfuInboundRtpPad.ts +0 -106
  264. package/src/ObservedSfuOutboundRtpPad.ts +0 -107
  265. package/src/ObservedSfuSctpChannel.ts +0 -103
  266. package/src/ObservedSfuTransport.ts +0 -185
  267. package/src/RemoteTrackAssigner.ts +0 -68
  268. package/src/ReportsCollector.ts +0 -336
  269. package/src/common/CalculatedScore.ts +0 -188
  270. package/src/common/CallEventType.ts +0 -69
  271. package/src/common/CallMetaReports.ts +0 -82
  272. package/src/common/QualityScoreUtils.ts +0 -0
  273. package/src/common/TypedEventEmitter.ts +0 -32
  274. package/src/common/callEventReports.ts +0 -178
  275. package/src/monitors/CallSummary.ts +0 -38
  276. package/src/monitors/CallSummaryMonitor.ts +0 -192
  277. package/src/monitors/ClientIssueMonitor.ts +0 -88
  278. package/src/monitors/SfuServerMonitor.ts +0 -285
  279. /package/lib/{monitors/CallSummary.js → ObservedCallSummary.js} +0 -0
@@ -1,681 +1,124 @@
1
1
  "use strict";
2
- var __rest = (this && this.__rest) || function (s, e) {
3
- var t = {};
4
- for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
5
- t[p] = s[p];
6
- if (s != null && typeof Object.getOwnPropertySymbols === "function")
7
- for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
8
- if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
9
- t[p[i]] = s[p[i]];
10
- }
11
- return t;
12
- };
13
2
  Object.defineProperty(exports, "__esModule", { value: true });
14
3
  exports.ObservedClient = void 0;
15
4
  const events_1 = require("events");
16
5
  const ObservedPeerConnection_1 = require("./ObservedPeerConnection");
17
6
  const logger_1 = require("./common/logger");
18
- const CallMetaReports_1 = require("./common/CallMetaReports");
19
- // eslint-disable-next-line camelcase
7
+ const ClientEventTypes_1 = require("./schema/ClientEventTypes");
8
+ const ClientMetaTypes_1 = require("./schema/ClientMetaTypes");
20
9
  const utils_1 = require("./common/utils");
21
- const CallEventType_1 = require("./common/CallEventType");
10
+ const Detectors_1 = require("./detectors/Detectors");
22
11
  const logger = (0, logger_1.createLogger)('ObservedClient');
23
12
  class ObservedClient extends events_1.EventEmitter {
24
- constructor(_model, call, appData) {
13
+ call;
14
+ detectors;
15
+ clientId;
16
+ observedPeerConnections = new Map();
17
+ calculatedScore = {
18
+ weight: 1,
19
+ value: undefined,
20
+ };
21
+ appData;
22
+ attachments;
23
+ updated = Date.now();
24
+ acceptedSamples = 0;
25
+ closed = false;
26
+ joinedAt;
27
+ leftAt;
28
+ // the timestamp of the CLIENT_JOINED event
29
+ operationSystem;
30
+ engine;
31
+ platform;
32
+ browser;
33
+ mediaConstraints = [];
34
+ usingTURN = false;
35
+ availableOutgoingBitrate = 0;
36
+ availableIncomingBitrate = 0;
37
+ totalInboundPacketsLost = 0;
38
+ totalInboundPacketsReceived = 0;
39
+ totalOutboundPacketsSent = 0;
40
+ totalDataChannelBytesSent = 0;
41
+ totalDataChannelBytesReceived = 0;
42
+ totalDataChannelMessagesSent = 0;
43
+ totalDataChannelMessagesReceived = 0;
44
+ totalReceivedAudioBytes = 0;
45
+ totalReceivedVideoBytes = 0;
46
+ totalSentAudioBytes = 0;
47
+ totalSentVideoBytes = 0;
48
+ totalSentBytes = 0;
49
+ totalReceivedBytes = 0;
50
+ deltaReceivedAudioBytes = 0;
51
+ deltaReceivedVideoBytes = 0;
52
+ deltaSentAudioBytes = 0;
53
+ deltaSentVideoBytes = 0;
54
+ deltaDataChannelBytesSent = 0;
55
+ deltaDataChannelBytesReceived = 0;
56
+ deltaDataChannelMessagesSent = 0;
57
+ deltaDataChannelMessagesReceived = 0;
58
+ deltaInboundPacketsLost = 0;
59
+ deltaInboundPacketsReceived = 0;
60
+ deltaOutboundPacketsSent = 0;
61
+ deltaRttInMsMeasurements = [];
62
+ deltaTransportSentBytes = 0;
63
+ deltaTransportReceivedBytes = 0;
64
+ deltaRttLt50Measurements = 0;
65
+ deltaRttLt150Measurements = 0;
66
+ deltaRttLt300Measurements = 0;
67
+ deltaRttGtOrEq300Measurements = 0;
68
+ currentRttInMs;
69
+ sendingAudioBitrate = 0;
70
+ sendingVideoBitrate = 0;
71
+ receivingAudioBitrate = 0;
72
+ receivingVideoBitrate = 0;
73
+ numberOfInboundRtpStreams = 0;
74
+ numberOfInbundTracks = 0;
75
+ numberOfOutboundRtpStreams = 0;
76
+ numberOfOutboundTracks = 0;
77
+ numberOfDataChannels = 0;
78
+ totalRttLt50Measurements = 0;
79
+ totalRttLt150Measurements = 0;
80
+ totalRttLt300Measurements = 0;
81
+ totalRttGtOrEq300Measurements = 0;
82
+ deltaNumberOfIssues = 0;
83
+ totalScoreSum = 0;
84
+ numberOfScoreMeasurements = 0;
85
+ numberOfIssues = 0;
86
+ mediaDevices = [];
87
+ issues = [];
88
+ constructor(settings, call) {
25
89
  super();
26
- this._model = _model;
27
90
  this.call = call;
28
- this.appData = appData;
29
- this.created = Date.now();
30
- this.updated = Date.now();
31
- this._peerConnections = new Map();
32
- this._closed = false;
33
- this._acceptedSamples = 0;
34
- this.usingTURN = false;
35
- this.availableOutgoingBitrate = 0;
36
- this.availableIncomingBitrate = 0;
37
- this.totalInboundPacketsLost = 0;
38
- this.totalInboundPacketsReceived = 0;
39
- this.totalOutboundPacketsSent = 0;
40
- this.totalDataChannelBytesSent = 0;
41
- this.totalDataChannelBytesReceived = 0;
42
- this.totalSentBytes = 0;
43
- this.totalReceivedBytes = 0;
44
- this.totalReceivedAudioBytes = 0;
45
- this.totalReceivedVideoBytes = 0;
46
- this.totalSentAudioBytes = 0;
47
- this.totalSentVideoBytes = 0;
48
- this.deltaReceivedAudioBytes = 0;
49
- this.deltaReceivedVideoBytes = 0;
50
- this.deltaSentAudioBytes = 0;
51
- this.deltaSentVideoBytes = 0;
52
- this.deltaDataChannelBytesSent = 0;
53
- this.deltaDataChannelBytesReceived = 0;
54
- this.deltaInboundPacketsLost = 0;
55
- this.deltaInboundPacketsReceived = 0;
56
- this.deltaOutboundPacketsSent = 0;
57
- this.mediaConstraints = [];
58
- this.mediaDevices = [];
59
- this.mediaCodecs = [];
60
- this.userMediaErrors = [];
61
- this.issues = [];
62
- this.ωpendingPeerConnectionTimestamps = [];
63
- this.ωpendingMediaTrackTimestamps = [];
64
91
  this.setMaxListeners(Infinity);
92
+ this.clientId = settings.clientId;
93
+ this.appData = settings.appData ?? {};
94
+ this.detectors = new Detectors_1.Detectors();
65
95
  }
66
- getSfu() {
67
- var _a;
68
- const sfu = this.call.observer.observedSfus.get((_a = this.sfuId) !== null && _a !== void 0 ? _a : '');
69
- if (!sfu)
70
- return;
71
- return sfu;
72
- }
73
- get joined() {
74
- return this._joined;
75
- }
76
- set joined(value) {
77
- this._joined = value;
78
- if (this._joined) {
79
- this.emit('joined');
80
- }
81
- }
82
- get left() {
83
- return this._left;
84
- }
85
- set left(value) {
86
- this._left = value;
87
- if (this._left) {
88
- this.emit('left');
89
- }
90
- }
91
- get sfu() {
92
- if (!this.sfuId)
93
- return;
94
- return this.call.observer.observedSfus.get(this.sfuId);
95
- }
96
- get coordinates() {
97
- return this._model.coordinates;
98
- }
99
- set coordinates(value) {
100
- this._model.coordinates = value;
101
- }
102
- get clientId() {
103
- // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
104
- return this._model.clientId;
105
- }
106
- get roomId() {
107
- // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
108
- return this.call.roomId;
109
- }
110
- get serviceId() {
111
- // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
112
- return this.call.serviceId;
113
- }
114
- get callId() {
115
- // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
116
- return this.call.callId;
117
- }
118
- get mediaUnitId() {
119
- // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
120
- return this._model.mediaUnitId;
96
+ get numberOfPeerConnections() {
97
+ return this.observedPeerConnections.size;
121
98
  }
122
- get reports() {
123
- return this.call.reports;
124
- }
125
- get userId() {
126
- return this._model.userId;
127
- }
128
- set userId(userId) {
129
- this._model.userId = userId;
130
- }
131
- get timeZoneOffsetInHours() {
132
- return this._timeZoneOffsetInHours;
133
- }
134
- get marker() {
135
- return this._model.marker;
136
- }
137
- get browser() {
138
- return this._model.browser;
139
- }
140
- get engine() {
141
- return this._model.engine;
142
- }
143
- get operationSystem() {
144
- return this._model.operationSystem;
145
- }
146
- get platform() {
147
- return this._model.platform;
148
- }
149
- get acceptedSamples() {
150
- return this._acceptedSamples;
151
- }
152
- get closed() {
153
- return this._closed;
154
- }
155
- get peerConnections() {
156
- return this._peerConnections;
99
+ get score() {
100
+ return this.calculatedScore.value;
157
101
  }
158
102
  close() {
159
- if (this._closed)
103
+ if (this.closed)
160
104
  return;
161
- this._closed = true;
162
- Array.from(this._peerConnections.values()).forEach((peerConnection) => peerConnection.close());
105
+ this.closed = true;
106
+ Array.from(this.observedPeerConnections.values()).forEach((peerConnection) => peerConnection.close());
163
107
  this.emit('close');
164
108
  }
165
- addEventReport(params) {
166
- var _a;
167
- const { attachments } = params, fields = __rest(params, ["attachments"]);
168
- this.reports.addCallEventReport(Object.assign(Object.assign({}, fields), { serviceId: this.serviceId, mediaUnitId: this.mediaUnitId, roomId: this.roomId, callId: this.callId, clientId: this.clientId, userId: this.userId, timestamp: (_a = params.timestamp) !== null && _a !== void 0 ? _a : Date.now(), marker: this.marker, attachments: attachments ? JSON.stringify(attachments) : undefined }));
169
- }
170
- addExtensionStatsReport(extensionType, payload) {
171
- this.reports.addClientExtensionReport({
172
- serviceId: this.serviceId,
173
- mediaUnitId: this.mediaUnitId,
174
- roomId: this.roomId,
175
- callId: this.callId,
176
- clientId: this.clientId,
177
- userId: this.userId,
178
- timestamp: Date.now(),
179
- extensionType,
180
- payload: JSON.stringify(payload),
181
- marker: this.marker,
182
- });
183
- }
184
- addIssue(issue) {
185
- var _a;
186
- try {
187
- this.reports.addCallEventReport({
188
- serviceId: this.serviceId,
189
- mediaUnitId: this.mediaUnitId,
190
- roomId: this.roomId,
191
- callId: this.callId,
192
- clientId: this.clientId,
193
- userId: this.userId,
194
- name: CallEventType_1.CallEventType.CLIENT_ISSUE,
195
- value: issue.severity,
196
- peerConnectionId: issue.peerConnectionId,
197
- mediaTrackId: issue.trackId,
198
- message: issue.description,
199
- timestamp: (_a = issue.timestamp) !== null && _a !== void 0 ? _a : Date.now(),
200
- attachments: issue.attachments ? JSON.stringify(issue.attachments) : undefined,
201
- });
202
- }
203
- catch (err) {
204
- logger.warn(`Error adding client issue: ${err === null || err === void 0 ? void 0 : err.message}`);
205
- }
206
- this._addAndEmitIssue(issue);
207
- }
208
109
  accept(sample) {
209
- var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t, _u, _v, _w, _x, _y, _z, _0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25;
210
- if (this._closed)
110
+ if (this.closed)
211
111
  throw new Error(`Client ${this.clientId} is closed`);
212
- if (sample.clientId && sample.clientId !== 'NULL' && sample.clientId !== this.clientId) {
213
- throw new Error(`Sample client id (${sample.clientId}) does not match the client id of the observed client (${this.clientId})`);
214
- }
215
112
  const now = Date.now();
216
- ++this._acceptedSamples;
217
- if (0 < this.issues.length) {
218
- // we reset the issues every time we accept a new sample
219
- this.issues = [];
220
- }
221
- for (const peerConnection of this._peerConnections.values()) {
222
- if (peerConnection.closed)
223
- continue;
224
- peerConnection.resetMetrics();
225
- }
226
- if (this._model.userId) {
227
- if (sample.userId && sample.userId !== 'NULL' && sample.userId !== this._model.userId) {
228
- this._model.userId = sample.userId;
229
- }
230
- }
231
- else if (sample.userId && sample.userId !== 'NULL') {
232
- this._model.userId = sample.userId;
233
- }
234
- if (this._model.marker !== sample.marker) {
235
- this._model.marker = sample.marker;
236
- this._peerConnections.forEach((peerConnection) => (peerConnection.marker = sample.marker));
237
- }
238
- if (this._timeZoneOffsetInHours !== sample.timeZoneOffsetInHours) {
239
- this._timeZoneOffsetInHours = sample.timeZoneOffsetInHours;
240
- }
241
- if (sample.os && (((_a = this._model.operationSystem) === null || _a === void 0 ? void 0 : _a.name) !== sample.os.name ||
242
- ((_b = this._model.operationSystem) === null || _b === void 0 ? void 0 : _b.version) !== sample.os.version ||
243
- ((_c = this._model.operationSystem) === null || _c === void 0 ? void 0 : _c.versionName) !== sample.os.versionName)) {
244
- this._model.operationSystem = sample.os;
245
- const callMetaReport = (0, CallMetaReports_1.createCallMetaReport)(this.serviceId, this.mediaUnitId, this.roomId, this.callId, this.clientId, {
246
- type: CallMetaReports_1.CallMetaType.OPERATION_SYSTEM,
247
- payload: sample.os,
248
- }, this.userId, undefined, sample.timestamp);
249
- this.reports.addCallMetaReport(callMetaReport);
250
- }
251
- if (sample.engine && (((_d = this._model.engine) === null || _d === void 0 ? void 0 : _d.name) !== sample.engine.name ||
252
- ((_e = this._model.engine) === null || _e === void 0 ? void 0 : _e.version) !== sample.engine.version)) {
253
- this._model.engine = sample.engine;
254
- const callMetaReport = (0, CallMetaReports_1.createCallMetaReport)(this.serviceId, this.mediaUnitId, this.roomId, this.callId, this.clientId, {
255
- type: CallMetaReports_1.CallMetaType.ENGINE,
256
- payload: sample.engine,
257
- }, this.userId, undefined, sample.timestamp);
258
- this.reports.addCallMetaReport(callMetaReport);
259
- }
260
- if (sample.platform && (((_f = this._model.platform) === null || _f === void 0 ? void 0 : _f.model) !== sample.platform.model ||
261
- ((_g = this._model.platform) === null || _g === void 0 ? void 0 : _g.type) !== sample.platform.type ||
262
- ((_h = this._model.platform) === null || _h === void 0 ? void 0 : _h.vendor) !== sample.platform.vendor)) {
263
- this._model.platform = sample.platform;
264
- const callMetaReport = (0, CallMetaReports_1.createCallMetaReport)(this.serviceId, this.mediaUnitId, this.roomId, this.callId, this.clientId, {
265
- type: CallMetaReports_1.CallMetaType.PLATFORM,
266
- payload: sample.platform,
267
- }, this.userId, undefined, sample.timestamp);
268
- this.reports.addCallMetaReport(callMetaReport);
269
- }
270
- if (sample.browser && (((_j = this._model.browser) === null || _j === void 0 ? void 0 : _j.name) !== sample.browser.name ||
271
- ((_k = this._model.browser) === null || _k === void 0 ? void 0 : _k.version) !== sample.browser.version)) {
272
- this._model.browser = sample.browser;
273
- const callMetaReport = (0, CallMetaReports_1.createCallMetaReport)(this.serviceId, this.mediaUnitId, this.roomId, this.callId, this.clientId, {
274
- type: CallMetaReports_1.CallMetaType.BROWSER,
275
- payload: sample.browser,
276
- }, this.userId, undefined, sample.timestamp);
277
- this.reports.addCallMetaReport(callMetaReport);
278
- }
279
- for (const mediaConstraint of (_l = sample.mediaConstraints) !== null && _l !== void 0 ? _l : []) {
280
- const callMetaReport = (0, CallMetaReports_1.createCallMetaReport)(this.serviceId, this.mediaUnitId, this.roomId, this.callId, this.clientId, {
281
- type: CallMetaReports_1.CallMetaType.MEDIA_CONSTRAINT,
282
- payload: mediaConstraint,
283
- }, this.userId, undefined, sample.timestamp);
284
- this.reports.addCallMetaReport(callMetaReport);
285
- this.mediaConstraints.push(mediaConstraint);
286
- }
287
- for (const localSDP of (_m = sample.localSDPs) !== null && _m !== void 0 ? _m : []) {
288
- const callMetaReport = (0, CallMetaReports_1.createCallMetaReport)(this.serviceId, this.mediaUnitId, this.roomId, this.callId, this.clientId, {
289
- type: CallMetaReports_1.CallMetaType.LOCAL_SDP,
290
- payload: localSDP,
291
- }, this.userId, undefined, sample.timestamp);
292
- this.reports.addCallMetaReport(callMetaReport);
293
- }
294
- for (const extensionStats of (_o = sample.extensionStats) !== null && _o !== void 0 ? _o : []) {
295
- this.reports.addClientExtensionReport({
296
- serviceId: this.serviceId,
297
- mediaUnitId: this.mediaUnitId,
298
- roomId: this.roomId,
299
- callId: this.callId,
300
- clientId: this.clientId,
301
- userId: this.userId,
302
- timestamp: now,
303
- payload: extensionStats.payload,
304
- extensionType: extensionStats.type,
305
- });
306
- }
307
- for (let _26 of (_p = sample.customCallEvents) !== null && _p !== void 0 ? _p : []) {
308
- const { timestamp } = _26, callEvent = __rest(_26, ["timestamp"]);
309
- switch (callEvent.name) {
310
- case CallEventType_1.CallEventType.CLIENT_JOINED: {
311
- const lastJoined = this.joined;
312
- this.joined = timestamp;
313
- // if it is joined before and it is joined again
314
- if (lastJoined && this.joined && lastJoined !== this.joined) {
315
- this.emit('rejoined', { lastJoined });
316
- }
317
- // in case we have a left event before the joined event
318
- if (this.left && this.joined && this.left < this.joined) {
319
- this.left = undefined;
320
- }
321
- break;
322
- }
323
- case CallEventType_1.CallEventType.CLIENT_LEFT: {
324
- this.left = timestamp;
325
- break;
326
- }
327
- case CallEventType_1.CallEventType.PEER_CONNECTION_OPENED: {
328
- callEvent.peerConnectionId && this.ωpendingPeerConnectionTimestamps.push({
329
- type: 'opened',
330
- peerConnectionId: callEvent.peerConnectionId,
331
- timestamp: timestamp !== null && timestamp !== void 0 ? timestamp : sample.timestamp,
332
- });
333
- break;
334
- }
335
- case CallEventType_1.CallEventType.PEER_CONNECTION_CLOSED: {
336
- callEvent.peerConnectionId && this.ωpendingPeerConnectionTimestamps.push({
337
- type: 'closed',
338
- peerConnectionId: callEvent.peerConnectionId,
339
- timestamp: timestamp !== null && timestamp !== void 0 ? timestamp : sample.timestamp,
340
- });
341
- break;
342
- }
343
- case CallEventType_1.CallEventType.MEDIA_TRACK_ADDED: {
344
- callEvent.peerConnectionId && callEvent.mediaTrackId && this.ωpendingMediaTrackTimestamps.push({
345
- type: 'added',
346
- peerConnectionId: callEvent.peerConnectionId,
347
- mediaTrackId: callEvent.mediaTrackId,
348
- timestamp: timestamp !== null && timestamp !== void 0 ? timestamp : sample.timestamp,
349
- });
350
- break;
351
- }
352
- case CallEventType_1.CallEventType.MEDIA_TRACK_REMOVED: {
353
- callEvent.peerConnectionId && callEvent.mediaTrackId && this.ωpendingMediaTrackTimestamps.push({
354
- type: 'removed',
355
- peerConnectionId: callEvent.peerConnectionId,
356
- mediaTrackId: callEvent.mediaTrackId,
357
- timestamp: timestamp !== null && timestamp !== void 0 ? timestamp : sample.timestamp,
358
- });
359
- break;
360
- }
361
- case CallEventType_1.CallEventType.CLIENT_ISSUE: {
362
- const severity = callEvent.value ? callEvent.value : 'minor';
363
- try {
364
- const issue = {
365
- severity,
366
- timestamp: timestamp !== null && timestamp !== void 0 ? timestamp : Date.now(),
367
- description: callEvent.message,
368
- peerConnectionId: callEvent.peerConnectionId,
369
- trackId: callEvent.mediaTrackId,
370
- attachments: callEvent.attachments ? JSON.parse(callEvent.attachments) : undefined,
371
- };
372
- this._addAndEmitIssue(issue);
373
- }
374
- catch (err) {
375
- logger.warn(`Error parsing client issue: ${err === null || err === void 0 ? void 0 : err.message}`);
376
- }
377
- break;
378
- }
379
- }
380
- this.reports.addCallEventReport(Object.assign({ serviceId: this.serviceId, mediaUnitId: this.mediaUnitId, roomId: this.roomId, callId: this.callId, clientId: this.clientId, userId: this.userId, timestamp: timestamp !== null && timestamp !== void 0 ? timestamp : now }, callEvent));
381
- this.call.emit('callevent', Object.assign({ mediaUnitId: this.mediaUnitId, clientId: this.clientId, userId: this.userId, timestamp: timestamp !== null && timestamp !== void 0 ? timestamp : now }, callEvent));
382
- }
383
- for (const userMediaError of (_q = sample.userMediaErrors) !== null && _q !== void 0 ? _q : []) {
384
- const callMetaReport = (0, CallMetaReports_1.createCallMetaReport)(this.serviceId, this.mediaUnitId, this.roomId, this.callId, this.clientId, {
385
- type: CallMetaReports_1.CallMetaType.USER_MEDIA_ERROR,
386
- payload: userMediaError,
387
- }, this.userId);
388
- this.reports.addCallMetaReport(callMetaReport);
389
- this.userMediaErrors.push(userMediaError);
390
- this.emit('usermediaerror', userMediaError);
391
- }
392
- for (const certificate of (_r = sample.certificates) !== null && _r !== void 0 ? _r : []) {
393
- const callMetaReport = (0, CallMetaReports_1.createCallMetaReport)(this.serviceId, this.mediaUnitId, this.roomId, this.callId, this.clientId, {
394
- type: CallMetaReports_1.CallMetaType.CERTIFICATE,
395
- payload: certificate,
396
- }, this.userId);
397
- this.reports.addCallMetaReport(callMetaReport);
398
- }
399
- for (const codec of (_s = sample.codecs) !== null && _s !== void 0 ? _s : []) {
400
- const callMetaReport = (0, CallMetaReports_1.createCallMetaReport)(this.serviceId, this.mediaUnitId, this.roomId, this.callId, this.clientId, {
401
- type: CallMetaReports_1.CallMetaType.CODEC,
402
- payload: codec,
403
- }, this.userId);
404
- this.reports.addCallMetaReport(callMetaReport);
405
- if (codec.mimeType && !this.mediaCodecs.find((c) => c.mimeType === codec.mimeType)) {
406
- this.mediaCodecs.push(codec);
407
- }
408
- }
409
- for (const iceServer of (_t = sample.iceServers) !== null && _t !== void 0 ? _t : []) {
410
- const callMetaReport = (0, CallMetaReports_1.createCallMetaReport)(this.serviceId, this.mediaUnitId, this.roomId, this.callId, this.clientId, {
411
- type: CallMetaReports_1.CallMetaType.ICE_SERVER,
412
- payload: iceServer,
413
- }, this.userId);
414
- this.reports.addCallMetaReport(callMetaReport);
415
- }
416
- for (const mediaDevice of (_u = sample.mediaDevices) !== null && _u !== void 0 ? _u : []) {
417
- const callMetaReport = (0, CallMetaReports_1.createCallMetaReport)(this.serviceId, this.mediaUnitId, this.roomId, this.callId, this.clientId, {
418
- type: CallMetaReports_1.CallMetaType.MEDIA_DEVICE,
419
- payload: mediaDevice,
420
- }, this.userId);
421
- this.reports.addCallMetaReport(callMetaReport);
422
- if (mediaDevice.id && !this.mediaDevices.find((d) => d.id === mediaDevice.id)) {
423
- this.mediaDevices.push(mediaDevice);
424
- }
425
- }
426
- for (const mediaSource of (_v = sample.mediaSources) !== null && _v !== void 0 ? _v : []) {
427
- const callMetaReport = (0, CallMetaReports_1.createCallMetaReport)(this.serviceId, this.mediaUnitId, this.roomId, this.callId, this.clientId, {
428
- type: CallMetaReports_1.CallMetaType.MEDIA_SOURCE,
429
- payload: mediaSource,
430
- }, this.userId);
431
- this.reports.addCallMetaReport(callMetaReport);
432
- }
433
- for (const transport of (_w = sample.pcTransports) !== null && _w !== void 0 ? _w : []) {
434
- try {
435
- const peerConnection = (_x = this._peerConnections.get(transport.transportId)) !== null && _x !== void 0 ? _x : this._createPeerConnection(transport.peerConnectionId);
436
- !peerConnection.label && transport.label && (peerConnection.label = transport.label);
437
- peerConnection.update(transport, sample.timestamp);
438
- }
439
- catch (err) {
440
- logger.error(`Error creating peer connection: ${err === null || err === void 0 ? void 0 : err.message}`);
441
- }
442
- }
443
- for (const track of (_y = sample.inboundAudioTracks) !== null && _y !== void 0 ? _y : []) {
444
- if (!track.peerConnectionId || !track.trackId) {
445
- logger.warn(`InboundAudioTrack without peerConnectionId or trackId: ${JSON.stringify(track)}`);
446
- continue;
447
- }
448
- try {
449
- const peerConnection = (_z = this._peerConnections.get(track.peerConnectionId)) !== null && _z !== void 0 ? _z : this._createPeerConnection(track.peerConnectionId);
450
- if (!peerConnection)
451
- continue;
452
- const inboundAudioTrack = (_0 = peerConnection.inboundAudioTracks.get(track.trackId)) !== null && _0 !== void 0 ? _0 : peerConnection.createInboundAudioTrack({
453
- trackId: track.trackId,
454
- sfuStreamId: track.sfuStreamId,
455
- sfuSinkId: track.sfuSinkId,
456
- });
457
- inboundAudioTrack.update(track, sample.timestamp);
458
- if (!inboundAudioTrack.remoteOutboundTrack) {
459
- const remoteOutboundTrack = this.call.sfuStreamIdToOutboundAudioTrack.get((_1 = inboundAudioTrack.sfuStreamId) !== null && _1 !== void 0 ? _1 : '');
460
- if (remoteOutboundTrack) {
461
- inboundAudioTrack.remoteOutboundTrack = remoteOutboundTrack;
462
- inboundAudioTrack.once('close', () => {
463
- var _a;
464
- remoteOutboundTrack === null || remoteOutboundTrack === void 0 ? void 0 : remoteOutboundTrack.remoteInboundTracks.delete((_a = inboundAudioTrack.trackId) !== null && _a !== void 0 ? _a : '');
465
- });
466
- remoteOutboundTrack.remoteInboundTracks.set((_2 = inboundAudioTrack.trackId) !== null && _2 !== void 0 ? _2 : '', inboundAudioTrack);
467
- }
468
- }
469
- }
470
- catch (err) {
471
- logger.error(`Error creating inbound audio track: ${err === null || err === void 0 ? void 0 : err.message}`);
472
- }
473
- }
474
- for (const track of (_3 = sample.inboundVideoTracks) !== null && _3 !== void 0 ? _3 : []) {
475
- if (!track.peerConnectionId || !track.trackId) {
476
- logger.warn(`InboundVideoTrack without peerConnectionId or trackId: ${JSON.stringify(track)}`);
477
- continue;
478
- }
479
- if ((0, utils_1.isValidUuid)(track.trackId) === false) {
480
- // mediasoup-probator trackId is not a valid UUID, no need to warn about it
481
- if (track.trackId === 'probator')
482
- continue;
483
- logger.warn(`InboundVideoTrack with invalid trackId: ${track.trackId}`);
484
- continue;
485
- }
486
- try {
487
- const peerConnection = (_4 = this._peerConnections.get(track.peerConnectionId)) !== null && _4 !== void 0 ? _4 : this._createPeerConnection(track.peerConnectionId);
488
- if (!peerConnection)
489
- continue;
490
- const inboundVideoTrack = (_5 = peerConnection.inboundVideoTracks.get(track.trackId)) !== null && _5 !== void 0 ? _5 : peerConnection.createInboundVideoTrack({
491
- trackId: track.trackId,
492
- sfuStreamId: track.sfuStreamId,
493
- sfuSinkId: track.sfuSinkId,
494
- });
495
- inboundVideoTrack.update(track, sample.timestamp);
496
- if (!inboundVideoTrack.remoteOutboundTrack) {
497
- const remoteOutboundTrack = this.call.sfuStreamIdToOutboundVideoTrack.get((_6 = inboundVideoTrack.sfuStreamId) !== null && _6 !== void 0 ? _6 : '');
498
- if (remoteOutboundTrack) {
499
- inboundVideoTrack.remoteOutboundTrack = remoteOutboundTrack;
500
- inboundVideoTrack.once('close', () => {
501
- var _a;
502
- remoteOutboundTrack === null || remoteOutboundTrack === void 0 ? void 0 : remoteOutboundTrack.remoteInboundTracks.delete((_a = inboundVideoTrack.trackId) !== null && _a !== void 0 ? _a : '');
503
- });
504
- remoteOutboundTrack.remoteInboundTracks.set((_7 = inboundVideoTrack.trackId) !== null && _7 !== void 0 ? _7 : '', inboundVideoTrack);
505
- }
506
- }
507
- }
508
- catch (err) {
509
- logger.error(`Error creating inbound video track: ${err === null || err === void 0 ? void 0 : err.message}`);
510
- }
511
- }
512
- for (const track of (_8 = sample.outboundAudioTracks) !== null && _8 !== void 0 ? _8 : []) {
513
- if (!track.peerConnectionId || !track.trackId) {
514
- logger.warn(`OutboundAudioTrack without peerConnectionId or trackId: ${JSON.stringify(track)}`);
515
- continue;
516
- }
517
- try {
518
- const peerConnection = (_9 = this._peerConnections.get(track.peerConnectionId)) !== null && _9 !== void 0 ? _9 : this._createPeerConnection(track.peerConnectionId);
519
- if (!peerConnection)
520
- continue;
521
- const outboundAudioTrack = (_10 = peerConnection.outboundAudioTracks.get(track.trackId)) !== null && _10 !== void 0 ? _10 : peerConnection.createOutboundAudioTrack({
522
- trackId: track.trackId,
523
- sfuStreamId: track.sfuStreamId,
524
- });
525
- outboundAudioTrack.update(track, sample.timestamp);
526
- if (outboundAudioTrack.sfuStreamId && !this.call.sfuStreamIdToOutboundAudioTrack.has(outboundAudioTrack.sfuStreamId)) {
527
- this.call.sfuStreamIdToOutboundAudioTrack.set(outboundAudioTrack.sfuStreamId, outboundAudioTrack);
528
- }
529
- }
530
- catch (err) {
531
- logger.error(`Error creating outbound audio track: ${err === null || err === void 0 ? void 0 : err.message}`);
532
- }
533
- }
534
- for (const track of (_11 = sample.outboundVideoTracks) !== null && _11 !== void 0 ? _11 : []) {
535
- if (!track.peerConnectionId || !track.trackId) {
536
- logger.warn(`OutboundVideoTrack without peerConnectionId or trackId: ${JSON.stringify(track)}`);
537
- continue;
538
- }
539
- try {
540
- const peerConnection = (_12 = this._peerConnections.get(track.peerConnectionId)) !== null && _12 !== void 0 ? _12 : this._createPeerConnection(track.peerConnectionId);
541
- if (!peerConnection)
542
- continue;
543
- const outboundVideoTrack = (_13 = peerConnection.outboundVideoTracks.get(track.trackId)) !== null && _13 !== void 0 ? _13 : peerConnection.createOutboundVideoTrack({
544
- trackId: track.trackId,
545
- sfuStreamId: track.sfuStreamId,
546
- });
547
- outboundVideoTrack.update(track, sample.timestamp);
548
- if (outboundVideoTrack.sfuStreamId && !this.call.sfuStreamIdToOutboundVideoTrack.has(outboundVideoTrack.sfuStreamId)) {
549
- this.call.sfuStreamIdToOutboundVideoTrack.set(outboundVideoTrack.sfuStreamId, outboundVideoTrack);
550
- }
551
- }
552
- catch (err) {
553
- logger.error(`Error creating outbound video track: ${err === null || err === void 0 ? void 0 : err.message}`);
554
- }
555
- }
556
- for (const iceLocalCandidate of (_14 = sample.iceLocalCandidates) !== null && _14 !== void 0 ? _14 : []) {
557
- if (!iceLocalCandidate.peerConnectionId) {
558
- logger.warn(`Local ice candidate without peerConnectionId: ${JSON.stringify(iceLocalCandidate)}`);
559
- continue;
560
- }
561
- const peerConnection = this._peerConnections.get(iceLocalCandidate.peerConnectionId);
562
- if (!peerConnection) {
563
- logger.debug(`Peer connection ${iceLocalCandidate.peerConnectionId} not found for ice local candidate ${iceLocalCandidate.id}`);
564
- continue;
565
- }
566
- peerConnection.ICE.addLocalCandidate(iceLocalCandidate, sample.timestamp);
567
- }
568
- for (const iceRemoteCandidate of (_15 = sample.iceRemoteCandidates) !== null && _15 !== void 0 ? _15 : []) {
569
- if (!iceRemoteCandidate.peerConnectionId) {
570
- logger.warn(`Remote ice candidate without peerConnectionId: ${JSON.stringify(iceRemoteCandidate)}`);
571
- continue;
572
- }
573
- const peerConnection = this._peerConnections.get(iceRemoteCandidate.peerConnectionId);
574
- if (!peerConnection) {
575
- logger.debug(`Peer connection ${iceRemoteCandidate.peerConnectionId} not found for ice remote candidate ${iceRemoteCandidate.id}`);
576
- continue;
577
- }
578
- peerConnection.ICE.addRemoteCandidate(iceRemoteCandidate, sample.timestamp);
579
- }
580
- for (const candidatePair of (_16 = sample.iceCandidatePairs) !== null && _16 !== void 0 ? _16 : []) {
581
- const peerConnection = this._peerConnections.get(candidatePair.peerConnectionId);
582
- if (!peerConnection) {
583
- logger.debug(`Peer connection ${candidatePair.peerConnectionId} not found for ice candidate pair ${candidatePair.localCandidateId}, ${candidatePair.remoteCandidateId}`);
584
- continue;
585
- }
586
- peerConnection.ICE.update(candidatePair, sample.timestamp);
587
- }
588
- for (const dataChannel of (_17 = sample.dataChannels) !== null && _17 !== void 0 ? _17 : []) {
589
- if (!dataChannel.peerConnectionId || !dataChannel.dataChannelIdentifier) {
590
- logger.warn(`DataChannel without peerConnectionId or dataChannelIdentifier: ${JSON.stringify(dataChannel)}`);
591
- continue;
592
- }
593
- try {
594
- const peerConnection = (_18 = this._peerConnections.get(dataChannel.peerConnectionId)) !== null && _18 !== void 0 ? _18 : this._createPeerConnection(dataChannel.peerConnectionId);
595
- if (!peerConnection)
596
- continue;
597
- const observedDataChannel = (_19 = peerConnection.dataChannels.get(dataChannel.dataChannelIdentifier)) !== null && _19 !== void 0 ? _19 : peerConnection.createDataChannel(dataChannel.dataChannelIdentifier);
598
- observedDataChannel.update(dataChannel, sample.timestamp);
599
- }
600
- catch (err) {
601
- logger.error(`Error creating data channel: ${err === null || err === void 0 ? void 0 : err.message}`);
602
- }
603
- }
604
- // try to set the timestamps of the peer connections
605
- if (0 < this.ωpendingPeerConnectionTimestamps.length) {
606
- const newPendingTimestamps = [];
607
- for (const pendingTimestamp of this.ωpendingPeerConnectionTimestamps) {
608
- const peerConnection = this._peerConnections.get(pendingTimestamp.peerConnectionId);
609
- if (!peerConnection) {
610
- newPendingTimestamps.push(pendingTimestamp);
611
- continue;
612
- }
613
- if (pendingTimestamp.type === 'opened')
614
- peerConnection.opened = pendingTimestamp.timestamp;
615
- else if (pendingTimestamp.type === 'closed')
616
- peerConnection.closedTimestamp = pendingTimestamp.timestamp;
617
- }
618
- this.ωpendingPeerConnectionTimestamps = newPendingTimestamps;
619
- }
620
- // try to set the timestamps of the media tracks
621
- if (0 < this.ωpendingMediaTrackTimestamps.length) {
622
- const newPendingTimestamps = [];
623
- for (const pendingTimestamp of this.ωpendingMediaTrackTimestamps) {
624
- const peerConnection = this._peerConnections.get(pendingTimestamp.peerConnectionId);
625
- const mediaTrack = (_22 = (_21 = (_20 = peerConnection === null || peerConnection === void 0 ? void 0 : peerConnection.inboundAudioTracks.get(pendingTimestamp.mediaTrackId)) !== null && _20 !== void 0 ? _20 : peerConnection === null || peerConnection === void 0 ? void 0 : peerConnection.inboundVideoTracks.get(pendingTimestamp.mediaTrackId)) !== null && _21 !== void 0 ? _21 : peerConnection === null || peerConnection === void 0 ? void 0 : peerConnection.outboundAudioTracks.get(pendingTimestamp.mediaTrackId)) !== null && _22 !== void 0 ? _22 : peerConnection === null || peerConnection === void 0 ? void 0 : peerConnection.outboundVideoTracks.get(pendingTimestamp.mediaTrackId);
626
- if (!mediaTrack) {
627
- newPendingTimestamps.push(pendingTimestamp);
628
- continue;
629
- }
630
- if (pendingTimestamp.type === 'added')
631
- mediaTrack.added = pendingTimestamp.timestamp;
632
- else if (pendingTimestamp.type === 'removed')
633
- mediaTrack.removed = pendingTimestamp.timestamp;
634
- }
635
- this.ωpendingMediaTrackTimestamps = newPendingTimestamps;
636
- }
637
- // close resources that are not visited
638
- for (const peerConnection of this._peerConnections.values()) {
639
- if (!peerConnection.visited) {
640
- peerConnection.close();
641
- continue;
642
- }
643
- for (const track of peerConnection.inboundAudioTracks.values()) {
644
- if (!track.visited) {
645
- track.close();
646
- continue;
647
- }
648
- track.visited = false;
649
- }
650
- for (const track of peerConnection.inboundVideoTracks.values()) {
651
- if (!track.visited) {
652
- track.close();
653
- continue;
654
- }
655
- track.visited = false;
656
- }
657
- for (const track of peerConnection.outboundAudioTracks.values()) {
658
- if (!track.visited) {
659
- track.close();
660
- continue;
661
- }
662
- track.visited = false;
663
- }
664
- for (const dataChannel of peerConnection.dataChannels.values()) {
665
- if (!dataChannel.visited) {
666
- dataChannel.close();
667
- continue;
668
- }
669
- dataChannel.visited = false;
670
- }
671
- peerConnection.visited = false;
672
- }
673
- // update metrics
674
- const wasUsingTURN = this.usingTURN;
675
- const elapsedTimeInMs = now - this.updated;
676
- this.usingTURN = false;
113
+ const elapsedInMs = now - this.updated;
114
+ const elapsedInSeconds = elapsedInMs / 1000;
115
+ ++this.acceptedSamples;
677
116
  this.availableIncomingBitrate = 0;
678
117
  this.availableOutgoingBitrate = 0;
118
+ this.deltaDataChannelBytesReceived = 0;
119
+ this.deltaDataChannelBytesSent = 0;
120
+ this.deltaDataChannelMessagesReceived = 0;
121
+ this.deltaDataChannelMessagesSent = 0;
679
122
  this.deltaInboundPacketsLost = 0;
680
123
  this.deltaInboundPacketsReceived = 0;
681
124
  this.deltaOutboundPacketsSent = 0;
@@ -683,117 +126,235 @@ class ObservedClient extends events_1.EventEmitter {
683
126
  this.deltaReceivedVideoBytes = 0;
684
127
  this.deltaSentAudioBytes = 0;
685
128
  this.deltaSentVideoBytes = 0;
686
- this.deltaDataChannelBytesReceived = 0;
687
- this.deltaDataChannelBytesSent = 0;
688
- this.outboundAudioBitrate = 0;
689
- this.outboundVideoBitrate = 0;
690
- this.inboundAudioBitrate = 0;
691
- this.inboundVideoBitrate = 0;
692
- let sumRttInMs = 0;
693
- let anyPeerConnectionUsingTurn = false;
694
- let minPcScore;
695
- let maxPcScore;
696
- let numberOfScoredPeerConnections = 0;
697
- for (const peerConnection of this._peerConnections.values()) {
698
- if (peerConnection.closed)
699
- continue;
700
- peerConnection.updateMetrics();
701
- this.deltaInboundPacketsLost += peerConnection.deltaInboundPacketsLost;
702
- this.deltaInboundPacketsReceived += peerConnection.deltaInboundPacketsReceived;
703
- this.deltaOutboundPacketsSent += peerConnection.deltaOutboundPacketsSent;
704
- this.deltaReceivedAudioBytes += peerConnection.deltaReceivedAudioBytes;
705
- this.deltaReceivedVideoBytes += peerConnection.deltaReceivedVideoBytes;
706
- this.deltaSentAudioBytes += peerConnection.deltaSentAudioBytes;
707
- this.deltaSentVideoBytes += peerConnection.deltaSentVideoBytes;
708
- this.deltaDataChannelBytesReceived += peerConnection.deltaDataChannelBytesReceived;
709
- this.deltaDataChannelBytesSent += peerConnection.deltaDataChannelBytesSent;
710
- this.availableIncomingBitrate += (_23 = peerConnection.availableIncomingBitrate) !== null && _23 !== void 0 ? _23 : 0;
711
- this.availableOutgoingBitrate += (_24 = peerConnection.availableOutgoingBitrate) !== null && _24 !== void 0 ? _24 : 0;
712
- sumRttInMs += (_25 = peerConnection.avgRttInMs) !== null && _25 !== void 0 ? _25 : 0;
713
- anyPeerConnectionUsingTurn || (anyPeerConnectionUsingTurn = peerConnection.usingTURN);
714
- if (peerConnection.score) {
715
- if (minPcScore === undefined || peerConnection.score.score < minPcScore)
716
- minPcScore = peerConnection.score.score;
717
- if (maxPcScore === undefined || peerConnection.score.score > maxPcScore)
718
- maxPcScore = peerConnection.score.score;
719
- ++numberOfScoredPeerConnections;
720
- }
721
- }
722
- this.score = {
723
- score: minPcScore !== null && minPcScore !== void 0 ? minPcScore : -1,
724
- remarks: [{
725
- severity: 'none',
726
- text: `Min and max score of all peer connections: ${minPcScore}, ${maxPcScore}, number of PeerConnections with scores: ${numberOfScoredPeerConnections}`,
727
- }],
728
- timestamp: sample.timestamp,
729
- };
730
- this.emit('score', this.score);
731
- this.usingTURN = anyPeerConnectionUsingTurn === true;
732
- if (wasUsingTURN !== this.usingTURN)
733
- this.emit('usingturn', this.usingTURN);
734
- this.totalSentBytes += this.deltaSentAudioBytes + this.deltaSentVideoBytes;
735
- this.totalReceivedBytes += this.deltaReceivedAudioBytes + this.deltaReceivedVideoBytes;
129
+ this.deltaTransportReceivedBytes = 0;
130
+ this.deltaTransportSentBytes = 0;
131
+ this.deltaRttInMsMeasurements = [];
132
+ this.deltaRttLt50Measurements = 0;
133
+ this.deltaRttLt150Measurements = 0;
134
+ this.deltaRttLt300Measurements = 0;
135
+ this.deltaRttGtOrEq300Measurements = 0;
136
+ this.deltaNumberOfIssues = 0;
137
+ this.numberOfDataChannels = 0;
138
+ this.numberOfInboundRtpStreams = 0;
139
+ this.numberOfInbundTracks = 0;
140
+ this.numberOfOutboundRtpStreams = 0;
141
+ this.numberOfOutboundTracks = 0;
142
+ sample.clientEvents?.forEach(this._processClientEvent.bind(this));
143
+ sample.clientMetaItems?.forEach(this.addMetadata.bind(this));
144
+ sample.clientIssues?.forEach(this.addIssue.bind(this));
145
+ sample.peerConnections?.forEach(this._updatePeerConnection.bind(this));
146
+ sample.extensionStats?.forEach(this.addExtensionStats.bind(this));
147
+ this._updateRttMeasurements();
148
+ // emit new attachments?
149
+ this.attachments = sample.attachments;
150
+ this.totalDataChannelBytesReceived += this.deltaDataChannelBytesReceived;
151
+ this.totalDataChannelBytesSent += this.deltaDataChannelBytesSent;
152
+ this.totalDataChannelMessagesReceived += this.deltaDataChannelMessagesReceived;
153
+ this.totalDataChannelMessagesSent += this.deltaDataChannelMessagesSent;
154
+ this.totalInboundPacketsLost += this.deltaInboundPacketsLost;
155
+ this.totalInboundPacketsReceived += this.deltaInboundPacketsReceived;
156
+ this.totalOutboundPacketsSent += this.deltaOutboundPacketsSent;
736
157
  this.totalReceivedAudioBytes += this.deltaReceivedAudioBytes;
737
158
  this.totalReceivedVideoBytes += this.deltaReceivedVideoBytes;
738
159
  this.totalSentAudioBytes += this.deltaSentAudioBytes;
739
160
  this.totalSentVideoBytes += this.deltaSentVideoBytes;
740
- this.totalOutboundPacketsSent += this.deltaOutboundPacketsSent;
741
- this.totalInboundPacketsReceived += this.deltaInboundPacketsReceived;
742
- this.totalInboundPacketsLost += this.deltaInboundPacketsLost;
743
- this.totalDataChannelBytesSent += this.deltaDataChannelBytesSent;
744
- this.totalDataChannelBytesReceived += this.deltaDataChannelBytesReceived;
745
- this.outboundAudioBitrate = (this.deltaSentAudioBytes * 8) / (Math.max(elapsedTimeInMs, 1) / 1000);
746
- this.outboundVideoBitrate = (this.deltaSentVideoBytes * 8) / (Math.max(elapsedTimeInMs, 1) / 1000);
747
- this.inboundAudioBitrate = (this.deltaReceivedAudioBytes * 8) / (Math.max(elapsedTimeInMs, 1) / 1000);
748
- this.inboundVideoBitrate = (this.deltaReceivedVideoBytes * 8) / (Math.max(elapsedTimeInMs, 1) / 1000);
749
- this.avgRttInMs = this._peerConnections.size ? sumRttInMs / this._peerConnections.size : undefined;
750
- // to make sure when sample is emitted it can be associated to this client
751
- sample.clientId = this.clientId;
752
- this.updated = now;
753
- this.lastStatsTimestamp = sample.timestamp;
161
+ this.totalReceivedBytes += this.deltaTransportReceivedBytes;
162
+ this.totalSentBytes += this.deltaTransportSentBytes;
163
+ this.totalRttLt50Measurements += this.deltaRttLt50Measurements;
164
+ this.totalRttLt150Measurements += this.deltaRttLt150Measurements;
165
+ this.totalRttLt300Measurements += this.deltaRttLt300Measurements;
166
+ this.totalRttGtOrEq300Measurements += this.deltaRttGtOrEq300Measurements;
167
+ this.numberOfIssues += this.deltaNumberOfIssues;
168
+ this.receivingAudioBitrate = (this.deltaReceivedAudioBytes * 8) / (elapsedInSeconds);
169
+ this.receivingVideoBitrate = (this.totalReceivedVideoBytes * 8) / (elapsedInSeconds);
170
+ this.sendingAudioBitrate = (this.deltaSentAudioBytes * 8) / (elapsedInSeconds);
171
+ this.sendingVideoBitrate = (this.deltaSentVideoBytes * 8) / (elapsedInSeconds);
172
+ this.calculatedScore.value = sample.score;
173
+ this.detectors.update();
174
+ // emit update
754
175
  this.emit('update', {
755
176
  sample,
756
- elapsedTimeInMs,
177
+ elapsedTimeInMs: now - this.updated,
757
178
  });
758
- }
759
- _addAndEmitIssue(issue) {
760
- var _a;
761
- this.issues.push(issue);
762
- if (issue.peerConnectionId) {
763
- const peerConnection = this._peerConnections.get(issue.peerConnectionId);
764
- if (peerConnection) {
765
- if (issue.trackId) {
766
- const track = (_a = peerConnection.inboundAudioTracks.get(issue.trackId)) !== null && _a !== void 0 ? _a : peerConnection.inboundVideoTracks.get(issue.trackId);
767
- if (track)
768
- track.ωpendingIssuesForScores.push(issue);
179
+ this.updated = now;
180
+ // if result changed after update
181
+ if (this.calculatedScore.value) {
182
+ this.totalScoreSum += this.calculatedScore.value;
183
+ ++this.numberOfScoreMeasurements;
184
+ }
185
+ }
186
+ _processClientEvent(event) {
187
+ // eslint-disable-next-line no-console
188
+ // console.warn('ClientEvent', event);
189
+ switch (event.type) {
190
+ case ClientEventTypes_1.ClientEventTypes.CLIENT_JOINED: {
191
+ if (event.timestamp) {
192
+ if (!this.joinedAt) {
193
+ this.joinedAt = event.timestamp;
194
+ this.emit('joined');
195
+ }
196
+ else if (this.joinedAt < event.timestamp) {
197
+ this.emit('rejoined', event.timestamp);
198
+ }
199
+ else {
200
+ this.joinedAt = event.timestamp;
201
+ logger.warn(`Client ${this.clientId} joinedAt timestamp was updated to ${event.timestamp}. the joined event will not be emitted.`);
202
+ }
769
203
  }
770
- else {
771
- peerConnection.ωpendingIssuesForScores.push(issue);
204
+ break;
205
+ }
206
+ case ClientEventTypes_1.ClientEventTypes.CLIENT_LEFT: {
207
+ if (event.timestamp) {
208
+ if (!this.leftAt) {
209
+ this.leftAt = event.timestamp;
210
+ this.emit('left');
211
+ }
212
+ else {
213
+ logger.warn(`Client ${this.clientId} leftAt timestamp was already set`);
214
+ }
772
215
  }
216
+ break;
217
+ }
218
+ }
219
+ this.call.observer.emit('client-event', this, event);
220
+ }
221
+ addMetadata(metadata) {
222
+ if (this.closed)
223
+ return;
224
+ switch (metadata.type) {
225
+ case ClientMetaTypes_1.ClientMetaTypes.BROWSER: {
226
+ this.browser = (0, utils_1.parseJsonAs)(metadata.payload);
227
+ break;
228
+ }
229
+ case ClientMetaTypes_1.ClientMetaTypes.ENGINE: {
230
+ this.engine = (0, utils_1.parseJsonAs)(metadata.payload);
231
+ break;
232
+ }
233
+ case ClientMetaTypes_1.ClientMetaTypes.PLATFORM: {
234
+ this.platform = (0, utils_1.parseJsonAs)(metadata.payload);
235
+ break;
236
+ }
237
+ case ClientMetaTypes_1.ClientMetaTypes.OPERATION_SYSTEM: {
238
+ this.operationSystem = (0, utils_1.parseJsonAs)(metadata.payload);
239
+ break;
773
240
  }
774
241
  }
242
+ this.call.observer.emit('client-metadata', this, metadata);
243
+ }
244
+ addIssue(issue) {
245
+ if (this.closed)
246
+ return;
247
+ ++this.deltaNumberOfIssues;
775
248
  this.emit('issue', issue);
249
+ this.call.observer.emit('client-issue', this, issue);
250
+ }
251
+ addExtensionStats(stats) {
252
+ this.call.observer.emit('client-extension-stats', this, stats);
776
253
  }
777
- _createPeerConnection(peerConnectionId, label) {
778
- const result = new ObservedPeerConnection_1.ObservedPeerConnection({
779
- peerConnectionId,
780
- label,
781
- }, this);
782
- const onNewSelectedCandidatePair = ({ localCandidate, remoteCandidate }) => {
783
- this.emit('selectedcandidatepair', {
784
- peerConnection: result,
785
- localCandidate,
786
- remoteCandidate,
254
+ _updatePeerConnection(sample) {
255
+ let observedPeerConnection = this.observedPeerConnections.get(sample.peerConnectionId);
256
+ if (!observedPeerConnection) {
257
+ if (!sample.peerConnectionId) {
258
+ return logger.warn(`ObservedClient received an invalid PeerConnectionSample (missing peerConnectionId field). ClientId: ${this.clientId}, CallId: ${this.call.callId}`, sample);
259
+ }
260
+ observedPeerConnection = new ObservedPeerConnection_1.ObservedPeerConnection(sample.peerConnectionId, this);
261
+ observedPeerConnection.once('close', () => {
262
+ this.observedPeerConnections.delete(sample.peerConnectionId);
787
263
  });
264
+ this.observedPeerConnections.set(sample.peerConnectionId, observedPeerConnection);
265
+ this.emit('newpeerconnection', observedPeerConnection);
266
+ }
267
+ observedPeerConnection.accept(sample);
268
+ observedPeerConnection.currentRttInMs;
269
+ this.deltaDataChannelBytesReceived += observedPeerConnection.deltaDataChannelBytesReceived;
270
+ this.deltaDataChannelBytesSent += observedPeerConnection.deltaDataChannelBytesSent;
271
+ this.deltaDataChannelMessagesReceived += observedPeerConnection.deltaDataChannelMessagesReceived;
272
+ this.deltaDataChannelMessagesSent += observedPeerConnection.deltaDataChannelMessagesSent;
273
+ this.deltaInboundPacketsLost += observedPeerConnection.deltaInboundPacketsLost;
274
+ this.deltaInboundPacketsReceived += observedPeerConnection.deltaInboundPacketsReceived;
275
+ this.deltaOutboundPacketsSent += observedPeerConnection.deltaOutboundPacketsSent;
276
+ this.deltaReceivedAudioBytes += observedPeerConnection.deltaReceivedAudioBytes;
277
+ this.deltaReceivedVideoBytes += observedPeerConnection.deltaReceivedVideoBytes;
278
+ this.deltaSentAudioBytes += observedPeerConnection.deltaSentAudioBytes;
279
+ this.deltaSentVideoBytes += observedPeerConnection.deltaSentVideoBytes;
280
+ this.deltaTransportReceivedBytes += observedPeerConnection.deltaTransportReceivedBytes;
281
+ this.deltaTransportSentBytes += observedPeerConnection.deltaTransportSentBytes;
282
+ this.availableIncomingBitrate += observedPeerConnection.availableIncomingBitrate;
283
+ this.availableOutgoingBitrate += observedPeerConnection.availableOutgoingBitrate;
284
+ this.numberOfDataChannels += observedPeerConnection.observedDataChannels.size;
285
+ this.numberOfInbundTracks += observedPeerConnection.observedInboundTracks.size;
286
+ this.numberOfOutboundRtpStreams += observedPeerConnection.observedOutboundRtps.size;
287
+ this.numberOfOutboundTracks += observedPeerConnection.observedOutboundTracks.size;
288
+ this.numberOfInboundRtpStreams += observedPeerConnection.observedInboundRtps.size;
289
+ if (observedPeerConnection.currentRttInMs) {
290
+ this.deltaRttInMsMeasurements.push(observedPeerConnection.currentRttInMs);
291
+ }
292
+ }
293
+ resetSummaryMetrics() {
294
+ this.totalDataChannelBytesReceived = 0;
295
+ this.totalDataChannelBytesSent = 0;
296
+ this.totalDataChannelMessagesReceived = 0;
297
+ this.totalDataChannelMessagesSent = 0;
298
+ this.totalInboundPacketsLost = 0;
299
+ this.totalInboundPacketsReceived = 0;
300
+ this.totalOutboundPacketsSent = 0;
301
+ this.totalReceivedAudioBytes = 0;
302
+ this.totalReceivedVideoBytes = 0;
303
+ this.totalSentAudioBytes = 0;
304
+ this.totalSentVideoBytes = 0;
305
+ this.totalSentBytes = 0;
306
+ this.totalReceivedBytes = 0;
307
+ this.numberOfIssues = 0;
308
+ this.totalScoreSum = 0;
309
+ this.numberOfScoreMeasurements = 0;
310
+ }
311
+ createSummary() {
312
+ return {
313
+ totalRttLt50Measurements: this.totalRttLt50Measurements,
314
+ totalRttLt150Measurements: this.totalRttLt150Measurements,
315
+ totalRttLt300Measurements: this.totalRttLt300Measurements,
316
+ totalRttGtOrEq300Measurements: this.totalRttGtOrEq300Measurements,
317
+ totalDataChannelBytesReceived: this.totalDataChannelBytesReceived,
318
+ totalDataChannelBytesSent: this.totalDataChannelBytesSent,
319
+ totalDataChannelMessagesReceived: this.totalDataChannelMessagesReceived,
320
+ totalDataChannelMessagesSent: this.totalDataChannelMessagesSent,
321
+ totalInboundPacketsLost: this.totalInboundPacketsLost,
322
+ totalInboundPacketsReceived: this.totalInboundPacketsReceived,
323
+ totalOutboundPacketsSent: this.totalOutboundPacketsSent,
324
+ totalReceivedAudioBytes: this.totalReceivedAudioBytes,
325
+ totalReceivedVideoBytes: this.totalReceivedVideoBytes,
326
+ totalSentAudioBytes: this.totalSentAudioBytes,
327
+ totalSentVideoBytes: this.totalSentVideoBytes,
328
+ totalSentBytes: this.totalSentBytes,
329
+ totalReceivedBytes: this.totalReceivedBytes,
330
+ numberOfIssues: this.numberOfIssues,
331
+ totalScoreSum: this.totalScoreSum,
332
+ numberOfScoreMeasurements: this.numberOfScoreMeasurements,
788
333
  };
789
- result.once('close', () => {
790
- result.ICE.off('new-selected-candidate-pair', onNewSelectedCandidatePair);
791
- this._peerConnections.delete(peerConnectionId);
792
- });
793
- result.ICE.on('new-selected-candidate-pair', onNewSelectedCandidatePair);
794
- this._peerConnections.set(peerConnectionId, result);
795
- this.emit('newpeerconnection', result);
796
- return result;
334
+ }
335
+ _updateRttMeasurements() {
336
+ if (this.deltaRttInMsMeasurements.length < 1) {
337
+ this.currentRttInMs = undefined;
338
+ return;
339
+ }
340
+ this.currentRttInMs = (0, utils_1.getMedian)(this.deltaRttInMsMeasurements, false);
341
+ if (this.currentRttInMs < 0) {
342
+ logger.warn(`Current Rtt for client ${this.clientId} is smaller than 0`);
343
+ this.currentRttInMs = undefined;
344
+ return;
345
+ }
346
+ if (this.currentRttInMs < 50) {
347
+ this.deltaRttLt50Measurements += 1;
348
+ }
349
+ else if (this.currentRttInMs < 150) {
350
+ this.deltaRttLt150Measurements += 1;
351
+ }
352
+ else if (this.currentRttInMs < 300) {
353
+ this.deltaRttLt300Measurements += 1;
354
+ }
355
+ else if (300 <= this.currentRttInMs) {
356
+ this.deltaRttGtOrEq300Measurements += 1;
357
+ }
797
358
  }
798
359
  }
799
360
  exports.ObservedClient = ObservedClient;