@observertc/observer-js 1.0.1-c3edea3.0 → 1.0.1-c665f5a.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 (204) hide show
  1. package/README.md +535 -1
  2. package/lib/ObservedCall.d.ts +45 -7
  3. package/lib/ObservedCall.d.ts.map +1 -1
  4. package/lib/ObservedCall.js +156 -14
  5. package/lib/ObservedCallEventMonitor.d.ts +104 -0
  6. package/lib/ObservedCallEventMonitor.d.ts.map +1 -0
  7. package/lib/ObservedCallEventMonitor.js +314 -0
  8. package/lib/ObservedCallSummary.d.ts +18 -0
  9. package/lib/ObservedCallSummary.d.ts.map +1 -0
  10. package/lib/ObservedClient.d.ts +78 -19
  11. package/lib/ObservedClient.d.ts.map +1 -1
  12. package/lib/ObservedClient.js +537 -80
  13. package/lib/ObservedClientEventMonitor.d.ts +91 -0
  14. package/lib/ObservedClientEventMonitor.d.ts.map +1 -0
  15. package/lib/ObservedClientEventMonitor.js +254 -0
  16. package/lib/ObservedClientSummary.d.ts +23 -0
  17. package/lib/ObservedClientSummary.d.ts.map +1 -0
  18. package/lib/ObservedClientSummary.js +2 -0
  19. package/lib/ObservedTURN.d.ts +31 -0
  20. package/lib/ObservedTURN.d.ts.map +1 -0
  21. package/lib/ObservedTURN.js +59 -0
  22. package/lib/ObservedTurnServer.d.ts +25 -0
  23. package/lib/ObservedTurnServer.d.ts.map +1 -0
  24. package/lib/ObservedTurnServer.js +59 -0
  25. package/lib/Observer.d.ts +42 -22
  26. package/lib/Observer.d.ts.map +1 -1
  27. package/lib/Observer.js +115 -40
  28. package/lib/ObserverEventMonitor.d.ts +138 -0
  29. package/lib/ObserverEventMonitor.d.ts.map +1 -0
  30. package/lib/ObserverEventMonitor.js +433 -0
  31. package/lib/ObserverSummary.d.ts +13 -0
  32. package/lib/ObserverSummary.d.ts.map +1 -0
  33. package/lib/ObserverSummary.js +2 -0
  34. package/lib/common/utils.d.ts +2 -1
  35. package/lib/common/utils.d.ts.map +1 -1
  36. package/lib/common/utils.js +11 -3
  37. package/lib/index.d.ts +22 -16
  38. package/lib/index.d.ts.map +1 -1
  39. package/lib/index.js +25 -17
  40. package/lib/mediasoup/ObservedMediasoupRouter.d.ts +7 -0
  41. package/lib/mediasoup/ObservedMediasoupRouter.d.ts.map +1 -0
  42. package/lib/mediasoup/ObservedMediasoupRouter.js +12 -0
  43. package/lib/schema/ClientEventTypes.d.ts +228 -0
  44. package/lib/schema/ClientEventTypes.d.ts.map +1 -0
  45. package/lib/schema/ClientEventTypes.js +41 -0
  46. package/lib/schema/{metaTypes.d.ts → ClientMetaTypes.d.ts} +2 -2
  47. package/lib/schema/ClientMetaTypes.d.ts.map +1 -0
  48. package/lib/schema/ClientMetaTypes.js +16 -0
  49. package/lib/schema/ClientSample.d.ts +1 -1
  50. package/lib/schema/ClientSample.d.ts.map +1 -1
  51. package/lib/updaters/CallUpdater.d.ts.map +1 -0
  52. package/lib/updaters/CallUpdater.js +2 -0
  53. package/lib/updaters/ObserverUpdater.d.ts +5 -0
  54. package/lib/updaters/ObserverUpdater.d.ts.map +1 -0
  55. package/lib/updaters/ObserverUpdater.js +2 -0
  56. package/lib/updaters/OnAllCallObserverUpdater.d.ts +15 -0
  57. package/lib/updaters/OnAllCallObserverUpdater.d.ts.map +1 -0
  58. package/lib/updaters/OnAllCallObserverUpdater.js +50 -0
  59. package/lib/updaters/OnAllClientCallUpdater.d.ts +15 -0
  60. package/lib/updaters/OnAllClientCallUpdater.d.ts.map +1 -0
  61. package/lib/updaters/OnAllClientCallUpdater.js +53 -0
  62. package/lib/updaters/OnAnyCallObserverUpdater.d.ts +12 -0
  63. package/lib/updaters/OnAnyCallObserverUpdater.d.ts.map +1 -0
  64. package/lib/updaters/OnAnyCallObserverUpdater.js +37 -0
  65. package/lib/updaters/OnAnyClientCallUpdater.d.ts +12 -0
  66. package/lib/updaters/OnAnyClientCallUpdater.d.ts.map +1 -0
  67. package/lib/updaters/OnAnyClientCallUpdater.js +36 -0
  68. package/lib/updaters/OnIntervalUpdater.d.ts +10 -0
  69. package/lib/updaters/OnIntervalUpdater.d.ts.map +1 -0
  70. package/lib/updaters/OnIntervalUpdater.js +17 -0
  71. package/lib/updaters/Updater.d.ts +6 -0
  72. package/lib/updaters/Updater.d.ts.map +1 -0
  73. package/lib/updaters/Updater.js +2 -0
  74. package/lib/utils/MediasoupRemoteTrackResolver.d.ts +25 -0
  75. package/lib/utils/MediasoupRemoteTrackResolver.d.ts.map +1 -0
  76. package/lib/utils/MediasoupRemoteTrackResolver.js +110 -0
  77. package/lib/utils/RemoteTrackResolver.d.ts +2 -2
  78. package/lib/utils/RemoteTrackResolver.d.ts.map +1 -1
  79. package/lib/{ObservedCertificate.d.ts → webrtc/ObservedCertificate.d.ts} +1 -1
  80. package/lib/webrtc/ObservedCertificate.d.ts.map +1 -0
  81. package/lib/{ObservedCodec.d.ts → webrtc/ObservedCodec.d.ts} +1 -1
  82. package/lib/webrtc/ObservedCodec.d.ts.map +1 -0
  83. package/lib/{ObservedDataChannel.d.ts → webrtc/ObservedDataChannel.d.ts} +7 -1
  84. package/lib/webrtc/ObservedDataChannel.d.ts.map +1 -0
  85. package/lib/{ObservedDataChannel.js → webrtc/ObservedDataChannel.js} +30 -0
  86. package/lib/{ObservedIceCandidate.d.ts → webrtc/ObservedIceCandidate.d.ts} +1 -1
  87. package/lib/webrtc/ObservedIceCandidate.d.ts.map +1 -0
  88. package/lib/{ObservedIceCandidatePair.d.ts → webrtc/ObservedIceCandidatePair.d.ts} +7 -2
  89. package/lib/webrtc/ObservedIceCandidatePair.d.ts.map +1 -0
  90. package/lib/{ObservedIceCandidatePair.js → webrtc/ObservedIceCandidatePair.js} +45 -1
  91. package/lib/{ObservedIceTransport.d.ts → webrtc/ObservedIceTransport.d.ts} +5 -1
  92. package/lib/webrtc/ObservedIceTransport.d.ts.map +1 -0
  93. package/lib/{ObservedIceTransport.js → webrtc/ObservedIceTransport.js} +28 -0
  94. package/lib/{ObservedInboundRtp.d.ts → webrtc/ObservedInboundRtp.d.ts} +2 -2
  95. package/lib/webrtc/ObservedInboundRtp.d.ts.map +1 -0
  96. package/lib/{ObservedInboundTrack.d.ts → webrtc/ObservedInboundTrack.d.ts} +7 -4
  97. package/lib/webrtc/ObservedInboundTrack.d.ts.map +1 -0
  98. package/lib/{ObservedInboundTrack.js → webrtc/ObservedInboundTrack.js} +4 -1
  99. package/lib/{ObservedMediaPlayout.d.ts → webrtc/ObservedMediaPlayout.d.ts} +2 -2
  100. package/lib/webrtc/ObservedMediaPlayout.d.ts.map +1 -0
  101. package/lib/{ObservedMediaSource.d.ts → webrtc/ObservedMediaSource.d.ts} +2 -2
  102. package/lib/webrtc/ObservedMediaSource.d.ts.map +1 -0
  103. package/lib/{ObservedOutboundRtp.d.ts → webrtc/ObservedOutboundRtp.d.ts} +2 -2
  104. package/lib/webrtc/ObservedOutboundRtp.d.ts.map +1 -0
  105. package/lib/{ObservedOutboundTrack.d.ts → webrtc/ObservedOutboundTrack.d.ts} +7 -4
  106. package/lib/webrtc/ObservedOutboundTrack.d.ts.map +1 -0
  107. package/lib/{ObservedOutboundTrack.js → webrtc/ObservedOutboundTrack.js} +4 -1
  108. package/lib/{ObservedPeerConnection.d.ts → webrtc/ObservedPeerConnection.d.ts} +39 -5
  109. package/lib/webrtc/ObservedPeerConnection.d.ts.map +1 -0
  110. package/lib/{ObservedPeerConnection.js → webrtc/ObservedPeerConnection.js} +185 -30
  111. package/lib/{ObservedPeerConnectionTransport.d.ts → webrtc/ObservedPeerConnectionTransport.d.ts} +1 -1
  112. package/lib/webrtc/ObservedPeerConnectionTransport.d.ts.map +1 -0
  113. package/lib/{ObservedRemoteInboundRtp.d.ts → webrtc/ObservedRemoteInboundRtp.d.ts} +2 -2
  114. package/lib/webrtc/ObservedRemoteInboundRtp.d.ts.map +1 -0
  115. package/lib/{ObservedRemoteOutboundRtp.d.ts → webrtc/ObservedRemoteOutboundRtp.d.ts} +2 -2
  116. package/lib/webrtc/ObservedRemoteOutboundRtp.d.ts.map +1 -0
  117. package/package.json +1 -1
  118. package/src/ObservedCall.ts +233 -17
  119. package/src/ObservedCallEventMonitor.ts +392 -0
  120. package/src/ObservedCallSummary.ts +22 -0
  121. package/src/ObservedClient.ts +644 -92
  122. package/src/ObservedClientEventMonitor.ts +309 -0
  123. package/src/ObservedClientSummary.ts +24 -0
  124. package/src/ObservedTURN.ts +87 -0
  125. package/src/ObservedTurnServer.ts +72 -0
  126. package/src/Observer.ts +168 -64
  127. package/src/ObserverEventMonitor.ts +551 -0
  128. package/src/ObserverSummary.ts +15 -0
  129. package/src/common/utils.ts +12 -2
  130. package/src/index.ts +22 -17
  131. package/src/mediasoup/ObservedMediasoupRouter.ts +12 -0
  132. package/src/schema/ClientEventTypes.ts +280 -0
  133. package/src/schema/{metaTypes.ts → ClientMetaTypes.ts} +1 -1
  134. package/src/schema/ClientSample.ts +1 -1
  135. package/src/updaters/ObserverUpdater.ts +5 -0
  136. package/src/updaters/OnAllCallObserverUpdater.ts +59 -0
  137. package/src/updaters/OnAllClientCallUpdater.ts +61 -0
  138. package/src/updaters/OnAnyCallObserverUpdater.ts +41 -0
  139. package/src/updaters/OnAnyClientCallUpdater.ts +39 -0
  140. package/src/updaters/OnIntervalUpdater.ts +19 -0
  141. package/src/updaters/Updater.ts +5 -0
  142. package/src/utils/MediasoupRemoteTrackResolver.ts +155 -0
  143. package/src/utils/RemoteTrackResolver.ts +2 -2
  144. package/src/{ObservedCertificate.ts → webrtc/ObservedCertificate.ts} +1 -1
  145. package/src/{ObservedCodec.ts → webrtc/ObservedCodec.ts} +1 -1
  146. package/src/{ObservedDataChannel.ts → webrtc/ObservedDataChannel.ts} +33 -1
  147. package/src/{ObservedIceCandidate.ts → webrtc/ObservedIceCandidate.ts} +1 -1
  148. package/src/{ObservedIceCandidatePair.ts → webrtc/ObservedIceCandidatePair.ts} +45 -3
  149. package/src/{ObservedIceTransport.ts → webrtc/ObservedIceTransport.ts} +30 -1
  150. package/src/{ObservedInboundRtp.ts → webrtc/ObservedInboundRtp.ts} +2 -2
  151. package/src/{ObservedInboundTrack.ts → webrtc/ObservedInboundTrack.ts} +9 -4
  152. package/src/{ObservedMediaPlayout.ts → webrtc/ObservedMediaPlayout.ts} +2 -2
  153. package/src/{ObservedMediaSource.ts → webrtc/ObservedMediaSource.ts} +2 -2
  154. package/src/{ObservedOutboundRtp.ts → webrtc/ObservedOutboundRtp.ts} +2 -2
  155. package/src/{ObservedOutboundTrack.ts → webrtc/ObservedOutboundTrack.ts} +9 -4
  156. package/src/{ObservedPeerConnection.ts → webrtc/ObservedPeerConnection.ts} +240 -51
  157. package/src/{ObservedPeerConnectionTransport.ts → webrtc/ObservedPeerConnectionTransport.ts} +1 -1
  158. package/src/{ObservedRemoteInboundRtp.ts → webrtc/ObservedRemoteInboundRtp.ts} +2 -2
  159. package/src/{ObservedRemoteOutboundRtp.ts → webrtc/ObservedRemoteOutboundRtp.ts} +2 -2
  160. package/tsconfig.json +1 -1
  161. package/lib/ObservedCertificate.d.ts.map +0 -1
  162. package/lib/ObservedCodec.d.ts.map +0 -1
  163. package/lib/ObservedDataChannel.d.ts.map +0 -1
  164. package/lib/ObservedIceCandidate.d.ts.map +0 -1
  165. package/lib/ObservedIceCandidatePair.d.ts.map +0 -1
  166. package/lib/ObservedIceTransport.d.ts.map +0 -1
  167. package/lib/ObservedInboundRtp.d.ts.map +0 -1
  168. package/lib/ObservedInboundTrack.d.ts.map +0 -1
  169. package/lib/ObservedMediaPlayout.d.ts.map +0 -1
  170. package/lib/ObservedMediaSource.d.ts.map +0 -1
  171. package/lib/ObservedOutboundRtp.d.ts.map +0 -1
  172. package/lib/ObservedOutboundTrack.d.ts.map +0 -1
  173. package/lib/ObservedPeerConnection.d.ts.map +0 -1
  174. package/lib/ObservedPeerConnectionTransport.d.ts.map +0 -1
  175. package/lib/ObservedRemoteInboundRtp.d.ts.map +0 -1
  176. package/lib/ObservedRemoteOutboundRtp.d.ts.map +0 -1
  177. package/lib/schema/eventTypes.d.ts +0 -33
  178. package/lib/schema/eventTypes.d.ts.map +0 -1
  179. package/lib/schema/eventTypes.js +0 -38
  180. package/lib/schema/metaTypes.d.ts.map +0 -1
  181. package/lib/schema/metaTypes.js +0 -16
  182. package/lib/utils/CallUpdater.d.ts.map +0 -1
  183. package/lib/utils/OnAllClientCallUpdater.d.ts +0 -16
  184. package/lib/utils/OnAllClientCallUpdater.d.ts.map +0 -1
  185. package/lib/utils/OnAllClientCallUpdater.js +0 -58
  186. package/lib/utils/onAnyClientCallUpdater.d.ts +0 -14
  187. package/lib/utils/onAnyClientCallUpdater.d.ts.map +0 -1
  188. package/lib/utils/onAnyClientCallUpdater.js +0 -51
  189. package/src/schema/eventTypes.ts +0 -36
  190. package/src/utils/OnAllClientCallUpdater.ts +0 -68
  191. package/src/utils/onAnyClientCallUpdater.ts +0 -59
  192. /package/lib/{utils/CallUpdater.js → ObservedCallSummary.js} +0 -0
  193. /package/lib/{utils → updaters}/CallUpdater.d.ts +0 -0
  194. /package/lib/{ObservedCertificate.js → webrtc/ObservedCertificate.js} +0 -0
  195. /package/lib/{ObservedCodec.js → webrtc/ObservedCodec.js} +0 -0
  196. /package/lib/{ObservedIceCandidate.js → webrtc/ObservedIceCandidate.js} +0 -0
  197. /package/lib/{ObservedInboundRtp.js → webrtc/ObservedInboundRtp.js} +0 -0
  198. /package/lib/{ObservedMediaPlayout.js → webrtc/ObservedMediaPlayout.js} +0 -0
  199. /package/lib/{ObservedMediaSource.js → webrtc/ObservedMediaSource.js} +0 -0
  200. /package/lib/{ObservedOutboundRtp.js → webrtc/ObservedOutboundRtp.js} +0 -0
  201. /package/lib/{ObservedPeerConnectionTransport.js → webrtc/ObservedPeerConnectionTransport.js} +0 -0
  202. /package/lib/{ObservedRemoteInboundRtp.js → webrtc/ObservedRemoteInboundRtp.js} +0 -0
  203. /package/lib/{ObservedRemoteOutboundRtp.js → webrtc/ObservedRemoteOutboundRtp.js} +0 -0
  204. /package/src/{utils → updaters}/CallUpdater.ts +0 -0
@@ -2,29 +2,30 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.ObservedClient = void 0;
4
4
  const events_1 = require("events");
5
- const ObservedPeerConnection_1 = require("./ObservedPeerConnection");
5
+ const ObservedPeerConnection_1 = require("./webrtc/ObservedPeerConnection");
6
6
  const logger_1 = require("./common/logger");
7
- const eventTypes_1 = require("./schema/eventTypes");
8
- const metaTypes_1 = require("./schema/metaTypes");
7
+ const ClientEventTypes_1 = require("./schema/ClientEventTypes");
8
+ const ClientMetaTypes_1 = require("./schema/ClientMetaTypes");
9
9
  const utils_1 = require("./common/utils");
10
10
  const Detectors_1 = require("./detectors/Detectors");
11
11
  const logger = (0, logger_1.createLogger)('ObservedClient');
12
12
  class ObservedClient extends events_1.EventEmitter {
13
+ settings;
13
14
  call;
14
15
  detectors;
15
- clientId;
16
16
  observedPeerConnections = new Map();
17
17
  calculatedScore = {
18
18
  weight: 1,
19
19
  value: undefined,
20
20
  };
21
- appData;
22
21
  attachments;
23
22
  updated = Date.now();
24
23
  acceptedSamples = 0;
25
24
  closed = false;
26
25
  joinedAt;
27
26
  leftAt;
27
+ closedAt;
28
+ lastSampleTimestamp;
28
29
  // the timestamp of the CLIENT_JOINED event
29
30
  operationSystem;
30
31
  engine;
@@ -32,43 +33,80 @@ class ObservedClient extends events_1.EventEmitter {
32
33
  browser;
33
34
  mediaConstraints = [];
34
35
  usingTURN = false;
36
+ usingTCP = false;
35
37
  availableOutgoingBitrate = 0;
36
38
  availableIncomingBitrate = 0;
37
- // public totalInboundPacketsLost = 0;
38
- // public totalInboundPacketsReceived = 0;
39
- // public totalOutboundPacketsSent = 0;
40
- // public totalDataChannelBytesSent = 0;
41
- // public totalDataChannelBytesReceived = 0;
42
- // public totalSentBytes = 0;
43
- // public totalReceivedBytes = 0;
44
- // public totalReceivedAudioBytes = 0;
45
- // public totalReceivedVideoBytes = 0;
46
- // public totalSentAudioBytes = 0;
47
- // public totalSentVideoBytes = 0;
48
- // public deltaReceivedAudioBytes = 0;
49
- // public deltaReceivedVideoBytes = 0;
50
- // public deltaSentAudioBytes = 0;
51
- // public deltaSentVideoBytes = 0;
52
- // public deltaDataChannelBytesSent = 0;
53
- // public deltaDataChannelBytesReceived = 0;
54
- // public deltaInboundPacketsLost = 0;
55
- // public deltaInboundPacketsReceived = 0;
56
- // public deltaOutboundPacketsSent = 0;
57
- avgRttInMs;
58
- outboundAudioBitrate;
59
- outboundVideoBitrate;
60
- inboundAudioBitrate;
61
- inboundVideoBitrate;
39
+ totalInboundPacketsLost = 0;
40
+ totalInboundPacketsReceived = 0;
41
+ totalOutboundPacketsSent = 0;
42
+ totalDataChannelBytesSent = 0;
43
+ totalDataChannelBytesReceived = 0;
44
+ totalDataChannelMessagesSent = 0;
45
+ totalDataChannelMessagesReceived = 0;
46
+ totalReceivedAudioBytes = 0;
47
+ totalReceivedVideoBytes = 0;
48
+ totalSentAudioBytes = 0;
49
+ totalSentVideoBytes = 0;
50
+ totalSentBytes = 0;
51
+ totalReceivedBytes = 0;
52
+ deltaReceivedAudioBytes = 0;
53
+ deltaReceivedVideoBytes = 0;
54
+ deltaSentAudioBytes = 0;
55
+ deltaSentVideoBytes = 0;
56
+ deltaDataChannelBytesSent = 0;
57
+ deltaDataChannelBytesReceived = 0;
58
+ deltaDataChannelMessagesSent = 0;
59
+ deltaDataChannelMessagesReceived = 0;
60
+ deltaInboundPacketsLost = 0;
61
+ deltaInboundPacketsReceived = 0;
62
+ deltaOutboundPacketsSent = 0;
63
+ deltaTransportSentBytes = 0;
64
+ deltaTransportReceivedBytes = 0;
65
+ deltaRttLt50Measurements = 0;
66
+ deltaRttLt150Measurements = 0;
67
+ deltaRttLt300Measurements = 0;
68
+ deltaRttGtOrEq300Measurements = 0;
69
+ currentMaxRttInMs;
70
+ currentMinRttInMs;
71
+ currentAvgRttInMs;
72
+ sendingAudioBitrate = 0;
73
+ sendingVideoBitrate = 0;
74
+ receivingAudioBitrate = 0;
75
+ receivingVideoBitrate = 0;
76
+ numberOfInboundRtpStreams = 0;
77
+ numberOfInbundTracks = 0;
78
+ numberOfOutboundRtpStreams = 0;
79
+ numberOfOutboundTracks = 0;
80
+ numberOfDataChannels = 0;
81
+ totalRttLt50Measurements = 0;
82
+ totalRttLt150Measurements = 0;
83
+ totalRttLt300Measurements = 0;
84
+ totalRttGtOrEq300Measurements = 0;
85
+ deltaNumberOfIssues = 0;
86
+ totalScoreSum = 0;
87
+ numberOfScoreMeasurements = 0;
88
+ totalNumberOfIssues = 0;
62
89
  mediaDevices = [];
63
90
  issues = [];
91
+ _injections = {};
92
+ _autoCloseTimer;
64
93
  constructor(settings, call) {
65
94
  super();
95
+ this.settings = settings;
66
96
  this.call = call;
67
97
  this.setMaxListeners(Infinity);
68
- this.clientId = settings.clientId;
69
- this.appData = settings.appData;
98
+ this._createAutoClose();
70
99
  this.detectors = new Detectors_1.Detectors();
71
100
  }
101
+ get clientId() {
102
+ return this.settings.clientId;
103
+ }
104
+ get appData() {
105
+ return this.settings.appData ?? {};
106
+ }
107
+ get numberOfPeerConnections() {
108
+ return this.observedPeerConnections.size;
109
+ }
72
110
  get score() {
73
111
  return this.calculatedScore.value;
74
112
  }
@@ -76,40 +114,185 @@ class ObservedClient extends events_1.EventEmitter {
76
114
  if (this.closed)
77
115
  return;
78
116
  this.closed = true;
117
+ this._injections.clientEvents?.forEach((clientEvent) => this._processClientEvent(clientEvent));
118
+ this._injections.clientIssues?.forEach((clientIssue) => this.addIssue(clientIssue));
119
+ this._injections.extensionStats?.forEach((extensionStat) => this.addExtensionStats(extensionStat));
120
+ this._injections.clientMetaItems?.forEach((clientMetaItem) => this.addMetadata(clientMetaItem));
79
121
  Array.from(this.observedPeerConnections.values()).forEach((peerConnection) => peerConnection.close());
122
+ if (!this.leftAt) {
123
+ this.leftAt = this.lastSampleTimestamp;
124
+ if (this.leftAt) {
125
+ this.emit('left');
126
+ }
127
+ }
128
+ this.closedAt = Date.now();
80
129
  this.emit('close');
81
130
  }
131
+ _createAutoClose() {
132
+ if (this.closed)
133
+ return;
134
+ if (this.settings.maxIdleTimeMs === undefined || this.settings.maxIdleTimeMs < 1)
135
+ return;
136
+ this._autoCloseTimer = setTimeout(() => {
137
+ if (this.closed)
138
+ return;
139
+ logger.debug(`Client ${this.clientId} is idle for ${this.settings.maxIdleTimeMs}ms, closing...`);
140
+ this.close();
141
+ }, this.settings.maxIdleTimeMs);
142
+ }
82
143
  accept(sample) {
83
144
  if (this.closed)
84
145
  throw new Error(`Client ${this.clientId} is closed`);
146
+ this._createAutoClose();
85
147
  const now = Date.now();
86
- sample.clientEvents?.forEach(this._processClientEvent.bind(this));
87
- sample.clientMetaItems?.forEach(this.processMetadata.bind(this));
88
- sample.clientIssues?.forEach(this.processIssue.bind(this));
89
- sample.peerConnections?.forEach(this._updatePeerConnection.bind(this));
90
- sample.extensionStats?.forEach(this.processExtensionStats.bind(this));
148
+ const elapsedInMs = now - this.updated;
149
+ const elapsedInSeconds = elapsedInMs / 1000;
150
+ let sumOfRtts = 0;
151
+ let numberOfRttMeasurements = 0;
152
+ ++this.acceptedSamples;
153
+ this.availableIncomingBitrate = 0;
154
+ this.availableOutgoingBitrate = 0;
155
+ this.deltaDataChannelBytesReceived = 0;
156
+ this.deltaDataChannelBytesSent = 0;
157
+ this.deltaDataChannelMessagesReceived = 0;
158
+ this.deltaDataChannelMessagesSent = 0;
159
+ this.deltaInboundPacketsLost = 0;
160
+ this.deltaInboundPacketsReceived = 0;
161
+ this.deltaOutboundPacketsSent = 0;
162
+ this.deltaReceivedAudioBytes = 0;
163
+ this.deltaReceivedVideoBytes = 0;
164
+ this.deltaSentAudioBytes = 0;
165
+ this.deltaSentVideoBytes = 0;
166
+ this.deltaTransportReceivedBytes = 0;
167
+ this.deltaTransportSentBytes = 0;
168
+ this.deltaRttLt50Measurements = 0;
169
+ this.deltaRttLt150Measurements = 0;
170
+ this.deltaRttLt300Measurements = 0;
171
+ this.deltaRttGtOrEq300Measurements = 0;
172
+ this.deltaNumberOfIssues = 0;
173
+ this.numberOfDataChannels = 0;
174
+ this.numberOfInboundRtpStreams = 0;
175
+ this.numberOfInbundTracks = 0;
176
+ this.numberOfOutboundRtpStreams = 0;
177
+ this.numberOfOutboundTracks = 0;
178
+ this.usingTURN = false;
179
+ this.usingTCP = false;
180
+ this.currentMinRttInMs = undefined;
181
+ this.currentMaxRttInMs = undefined;
182
+ this._mergeInjections(sample);
183
+ const clientEventsPostBuffer = [];
184
+ for (const clientEvent of sample.clientEvents ?? []) {
185
+ this._processClientEvent(clientEvent, clientEventsPostBuffer);
186
+ this.call.observer.emit('client-event', this, clientEvent);
187
+ }
188
+ for (const metaData of sample.clientMetaItems ?? []) {
189
+ this.addMetadata(metaData);
190
+ }
191
+ for (const issue of sample.clientIssues ?? []) {
192
+ this.addIssue(issue);
193
+ ++this.deltaNumberOfIssues;
194
+ }
195
+ for (const extensionStat of sample.extensionStats ?? []) {
196
+ this.addExtensionStats(extensionStat);
197
+ }
198
+ for (const pcSample of sample.peerConnections ?? []) {
199
+ const observedPeerConnection = this._updatePeerConnection(pcSample);
200
+ if (!observedPeerConnection)
201
+ continue;
202
+ this.deltaDataChannelBytesReceived += observedPeerConnection.deltaDataChannelBytesReceived;
203
+ this.deltaDataChannelBytesSent += observedPeerConnection.deltaDataChannelBytesSent;
204
+ this.deltaDataChannelMessagesReceived += observedPeerConnection.deltaDataChannelMessagesReceived;
205
+ this.deltaDataChannelMessagesSent += observedPeerConnection.deltaDataChannelMessagesSent;
206
+ this.deltaInboundPacketsLost += observedPeerConnection.deltaInboundPacketsLost;
207
+ this.deltaInboundPacketsReceived += observedPeerConnection.deltaInboundPacketsReceived;
208
+ this.deltaOutboundPacketsSent += observedPeerConnection.deltaOutboundPacketsSent;
209
+ this.deltaReceivedAudioBytes += observedPeerConnection.deltaReceivedAudioBytes;
210
+ this.deltaReceivedVideoBytes += observedPeerConnection.deltaReceivedVideoBytes;
211
+ this.deltaSentAudioBytes += observedPeerConnection.deltaSentAudioBytes;
212
+ this.deltaSentVideoBytes += observedPeerConnection.deltaSentVideoBytes;
213
+ this.deltaTransportReceivedBytes += observedPeerConnection.deltaTransportReceivedBytes;
214
+ this.deltaTransportSentBytes += observedPeerConnection.deltaTransportSentBytes;
215
+ this.availableIncomingBitrate += observedPeerConnection.availableIncomingBitrate;
216
+ this.availableOutgoingBitrate += observedPeerConnection.availableOutgoingBitrate;
217
+ this.numberOfDataChannels += observedPeerConnection.observedDataChannels.size;
218
+ this.numberOfInbundTracks += observedPeerConnection.observedInboundTracks.size;
219
+ this.numberOfOutboundRtpStreams += observedPeerConnection.observedOutboundRtps.size;
220
+ this.numberOfOutboundTracks += observedPeerConnection.observedOutboundTracks.size;
221
+ this.numberOfInboundRtpStreams += observedPeerConnection.observedInboundRtps.size;
222
+ if (observedPeerConnection.usingTURN) {
223
+ this.usingTURN = true;
224
+ }
225
+ if (observedPeerConnection.usingTCP) {
226
+ this.usingTCP = true;
227
+ }
228
+ if (observedPeerConnection.currentRttInMs) {
229
+ if (this.currentMinRttInMs === undefined || observedPeerConnection.currentRttInMs < this.currentMinRttInMs) {
230
+ this.currentMinRttInMs = observedPeerConnection.currentRttInMs;
231
+ }
232
+ if (this.currentMaxRttInMs === undefined || observedPeerConnection.currentRttInMs > this.currentMaxRttInMs) {
233
+ this.currentMaxRttInMs = observedPeerConnection.currentRttInMs;
234
+ }
235
+ if (observedPeerConnection.currentRttInMs < 50) {
236
+ this.deltaRttLt50Measurements += 1;
237
+ }
238
+ else if (observedPeerConnection.currentRttInMs < 150) {
239
+ this.deltaRttLt150Measurements += 1;
240
+ }
241
+ else if (observedPeerConnection.currentRttInMs < 300) {
242
+ this.deltaRttLt300Measurements += 1;
243
+ }
244
+ else if (300 <= observedPeerConnection.currentRttInMs) {
245
+ this.deltaRttGtOrEq300Measurements += 1;
246
+ }
247
+ sumOfRtts += observedPeerConnection.currentRttInMs;
248
+ ++numberOfRttMeasurements;
249
+ }
250
+ }
251
+ for (const clientEvent of clientEventsPostBuffer) {
252
+ this._processClientEvent(clientEvent);
253
+ }
91
254
  // emit new attachments?
92
255
  this.attachments = sample.attachments;
256
+ this.totalDataChannelBytesReceived += this.deltaDataChannelBytesReceived;
257
+ this.totalDataChannelBytesSent += this.deltaDataChannelBytesSent;
258
+ this.totalDataChannelMessagesReceived += this.deltaDataChannelMessagesReceived;
259
+ this.totalDataChannelMessagesSent += this.deltaDataChannelMessagesSent;
260
+ this.totalInboundPacketsLost += this.deltaInboundPacketsLost;
261
+ this.totalInboundPacketsReceived += this.deltaInboundPacketsReceived;
262
+ this.totalOutboundPacketsSent += this.deltaOutboundPacketsSent;
263
+ this.totalReceivedAudioBytes += this.deltaReceivedAudioBytes;
264
+ this.totalReceivedVideoBytes += this.deltaReceivedVideoBytes;
265
+ this.totalSentAudioBytes += this.deltaSentAudioBytes;
266
+ this.totalSentVideoBytes += this.deltaSentVideoBytes;
267
+ this.totalReceivedBytes += this.deltaTransportReceivedBytes;
268
+ this.totalSentBytes += this.deltaTransportSentBytes;
269
+ this.totalRttLt50Measurements += this.deltaRttLt50Measurements;
270
+ this.totalRttLt150Measurements += this.deltaRttLt150Measurements;
271
+ this.totalRttLt300Measurements += this.deltaRttLt300Measurements;
272
+ this.totalRttGtOrEq300Measurements += this.deltaRttGtOrEq300Measurements;
273
+ this.totalNumberOfIssues += this.deltaNumberOfIssues;
274
+ this.receivingAudioBitrate = (this.deltaReceivedAudioBytes * 8) / (elapsedInSeconds);
275
+ this.receivingVideoBitrate = (this.totalReceivedVideoBytes * 8) / (elapsedInSeconds);
276
+ this.sendingAudioBitrate = (this.deltaSentAudioBytes * 8) / (elapsedInSeconds);
277
+ this.sendingVideoBitrate = (this.deltaSentVideoBytes * 8) / (elapsedInSeconds);
278
+ this.currentAvgRttInMs = 0 < numberOfRttMeasurements ? sumOfRtts / numberOfRttMeasurements : undefined;
93
279
  this.calculatedScore.value = sample.score;
94
280
  this.detectors.update();
281
+ this.lastSampleTimestamp = sample.timestamp;
95
282
  // emit update
96
- this.emit('update', {
97
- sample,
98
- elapsedTimeInMs: now - this.updated,
99
- });
283
+ this.emit('update', sample, now - this.updated);
100
284
  this.updated = now;
285
+ // if result changed after update
286
+ if (this.calculatedScore.value) {
287
+ this.totalScoreSum += this.calculatedScore.value;
288
+ ++this.numberOfScoreMeasurements;
289
+ }
101
290
  }
102
- _processClientEvent(event) {
291
+ _processClientEvent(event, postBuffer) {
292
+ // eslint-disable-next-line no-console
293
+ // console.warn('ClientEvent', event);
103
294
  switch (event.type) {
104
- case eventTypes_1.ClientEventType.CALL_STARTED: {
105
- // update call timestamp if it's the first time
106
- break;
107
- }
108
- case eventTypes_1.ClientEventType.CALL_ENDED: {
109
- // update call timestamp if it's the first time
110
- break;
111
- }
112
- case eventTypes_1.ClientEventType.CLIENT_JOINED: {
295
+ case ClientEventTypes_1.ClientEventTypes.CLIENT_JOINED: {
113
296
  if (event.timestamp) {
114
297
  if (!this.joinedAt) {
115
298
  this.joinedAt = event.timestamp;
@@ -123,76 +306,350 @@ class ObservedClient extends events_1.EventEmitter {
123
306
  logger.warn(`Client ${this.clientId} joinedAt timestamp was updated to ${event.timestamp}. the joined event will not be emitted.`);
124
307
  }
125
308
  }
309
+ logger.debug('Client %s joined at %o', this.clientId, event);
126
310
  break;
127
311
  }
128
- case eventTypes_1.ClientEventType.CLIENT_LEFT: {
312
+ case ClientEventTypes_1.ClientEventTypes.CLIENT_LEFT: {
129
313
  if (event.timestamp) {
130
314
  if (!this.leftAt) {
131
315
  this.leftAt = event.timestamp;
132
316
  this.emit('left');
133
317
  }
318
+ else {
319
+ logger.warn(`Client ${this.clientId} leftAt timestamp was already set`);
320
+ }
321
+ }
322
+ logger.debug('Client %s left at %o', this.clientId, event);
323
+ break;
324
+ }
325
+ case ClientEventTypes_1.ClientEventTypes.PEER_CONNECTION_OPENED: {
326
+ const payload = (0, utils_1.parseJsonAs)(event.payload);
327
+ if (payload?.peerConnectionId && typeof payload.peerConnectionId === 'string') {
328
+ const observedPeerConnection = this.observedPeerConnections.get(payload.peerConnectionId);
329
+ if (observedPeerConnection) {
330
+ observedPeerConnection.openedAt = event.timestamp;
331
+ }
332
+ else if (postBuffer) {
333
+ postBuffer.push(event);
334
+ }
335
+ else {
336
+ logger.warn('Received PEER_CONNECTION_OPENED event without a corresponding observedPeerConnection: %o', event);
337
+ }
338
+ }
339
+ break;
340
+ }
341
+ case ClientEventTypes_1.ClientEventTypes.PEER_CONNECTION_CLOSED: {
342
+ const payload = (0, utils_1.parseJsonAs)(event.payload);
343
+ if (payload?.peerConnectionId && typeof payload.peerConnectionId === 'string') {
344
+ const observedPeerConnection = this.observedPeerConnections.get(payload.peerConnectionId);
345
+ if (observedPeerConnection) {
346
+ observedPeerConnection.closedAt = event.timestamp;
347
+ }
348
+ else if (postBuffer) {
349
+ postBuffer.push(event);
350
+ }
351
+ else {
352
+ logger.warn('Received PEER_CONNECTION_CLOSED event without a corresponding observedPeerConnection: %o', event);
353
+ }
354
+ }
355
+ break;
356
+ }
357
+ case ClientEventTypes_1.ClientEventTypes.MEDIA_TRACK_ADDED: {
358
+ const payload = (0, utils_1.parseJsonAs)(event.payload);
359
+ if (payload?.peerConnectionId && typeof payload.peerConnectionId === 'string' && payload?.trackId && typeof payload.trackId === 'string') {
360
+ const observedPeerConnection = this.observedPeerConnections.get(payload.peerConnectionId);
361
+ const observedTrack = observedPeerConnection?.observedInboundTracks.get(payload.trackId) ?? observedPeerConnection?.observedOutboundTracks.get(payload.trackId);
362
+ if (observedTrack) {
363
+ observedTrack.addedAt = event.timestamp;
364
+ }
365
+ else if (postBuffer) {
366
+ postBuffer.push(event);
367
+ }
368
+ else {
369
+ logger.warn('Received MEDIA_TRACK_ADDED event without a corresponding observedPeerConnection or observedTrack: %o', event);
370
+ }
371
+ }
372
+ break;
373
+ }
374
+ case ClientEventTypes_1.ClientEventTypes.MEDIA_TRACK_REMOVED: {
375
+ const payload = (0, utils_1.parseJsonAs)(event.payload);
376
+ if (payload?.peerConnectionId && typeof payload.peerConnectionId === 'string' && payload?.trackId && typeof payload.trackId === 'string') {
377
+ const observedPeerConnection = this.observedPeerConnections.get(payload.peerConnectionId);
378
+ const observedTrack = observedPeerConnection?.observedInboundTracks.get(payload.trackId) ?? observedPeerConnection?.observedOutboundTracks.get(payload.trackId);
379
+ if (observedTrack) {
380
+ observedTrack.removedAt = event.timestamp;
381
+ }
382
+ else if (postBuffer) {
383
+ postBuffer.push(event);
384
+ }
385
+ else {
386
+ logger.warn('Received MEDIA_TRACK_REMOVED event without a corresponding observedPeerConnection or observedTrack: %o', event);
387
+ }
388
+ }
389
+ break;
390
+ }
391
+ case ClientEventTypes_1.ClientEventTypes.DATA_CHANNEL_OPEN: {
392
+ const payload = (0, utils_1.parseJsonAs)(event.payload);
393
+ if (payload?.peerConnectionId && typeof payload.peerConnectionId === 'string' && payload?.dataChannelId && typeof payload.dataChannelId === 'string') {
394
+ const observedPeerConnection = this.observedPeerConnections.get(payload.peerConnectionId);
395
+ const observedDataChannel = observedPeerConnection?.observedDataChannels.get(payload.dataChannelId);
396
+ if (observedDataChannel) {
397
+ observedDataChannel.addedAt = event.timestamp;
398
+ }
399
+ else if (postBuffer) {
400
+ postBuffer.push(event);
401
+ }
402
+ else {
403
+ logger.warn('Received DATA_CHANNEL_OPENED event without a corresponding observedPeerConnection or observedDataChannel: %o', event);
404
+ }
405
+ }
406
+ break;
407
+ }
408
+ case ClientEventTypes_1.ClientEventTypes.DATA_CHANNEL_CLOSED: {
409
+ const payload = (0, utils_1.parseJsonAs)(event.payload);
410
+ if (payload?.peerConnectionId && typeof payload.peerConnectionId === 'string' && payload?.dataChannelId && typeof payload.dataChannelId === 'string') {
411
+ const observedPeerConnection = this.observedPeerConnections.get(payload.peerConnectionId);
412
+ const observedDataChannel = observedPeerConnection?.observedDataChannels.get(payload.dataChannelId);
413
+ if (observedDataChannel) {
414
+ observedDataChannel.removedAt = event.timestamp;
415
+ }
416
+ else if (postBuffer) {
417
+ postBuffer.push(event);
418
+ }
419
+ else {
420
+ logger.warn('Received DATA_CHANNEL_CLOSE event without a corresponding observedPeerConnection or observedDataChannel: %o', event);
421
+ }
422
+ }
423
+ break;
424
+ }
425
+ case ClientEventTypes_1.ClientEventTypes.MEDIA_TRACK_MUTED: {
426
+ const payload = (0, utils_1.parseJsonAs)(event.payload);
427
+ if (payload?.peerConnectionId && typeof payload.peerConnectionId === 'string' && payload?.trackId && typeof payload.trackId === 'string') {
428
+ const observedPeerConnection = this.observedPeerConnections.get(payload.peerConnectionId);
429
+ const observedInboundTrack = observedPeerConnection?.observedInboundTracks.get(payload.trackId);
430
+ const observedOutboundTrack = observedPeerConnection?.observedOutboundTracks.get(payload.trackId);
431
+ if (observedPeerConnection) {
432
+ if (observedInboundTrack) {
433
+ observedInboundTrack.muted = true;
434
+ observedPeerConnection?.emit('muted-inbound-track', observedInboundTrack);
435
+ }
436
+ else if (observedOutboundTrack) {
437
+ observedOutboundTrack.muted = true;
438
+ observedPeerConnection?.emit('muted-outbound-track', observedOutboundTrack);
439
+ }
440
+ }
441
+ else if (postBuffer) {
442
+ postBuffer.push(event);
443
+ }
444
+ else {
445
+ logger.warn('Received MEDIA_TRACK_MUTED event without a corresponding observedPeerConnection or observedTrack: %o', event);
446
+ }
447
+ }
448
+ break;
449
+ }
450
+ case ClientEventTypes_1.ClientEventTypes.MEDIA_TRACK_UNMUTED: {
451
+ const payload = (0, utils_1.parseJsonAs)(event.payload);
452
+ if (payload?.peerConnectionId && typeof payload.peerConnectionId === 'string' && payload?.trackId && typeof payload.trackId === 'string') {
453
+ const observedPeerConnection = this.observedPeerConnections.get(payload.peerConnectionId);
454
+ const observedInboundTrack = observedPeerConnection?.observedInboundTracks.get(payload.trackId);
455
+ const observedOutboundTrack = observedPeerConnection?.observedOutboundTracks.get(payload.trackId);
456
+ if (observedPeerConnection) {
457
+ if (observedInboundTrack) {
458
+ observedInboundTrack.muted = false;
459
+ observedPeerConnection?.emit('unmuted-inbound-track', observedInboundTrack);
460
+ }
461
+ else if (observedOutboundTrack) {
462
+ observedOutboundTrack.muted = false;
463
+ observedPeerConnection?.emit('unmuted-outbound-track', observedOutboundTrack);
464
+ }
465
+ }
466
+ else if (postBuffer) {
467
+ postBuffer.push(event);
468
+ }
469
+ else {
470
+ logger.warn('Received MEDIA_TRACK_UNMUTED event without a corresponding observedPeerConnection or observedTrack: %o', event);
471
+ }
472
+ }
473
+ break;
474
+ }
475
+ case ClientEventTypes_1.ClientEventTypes.ICE_CONNECTION_STATE_CHANGED: {
476
+ const payload = (0, utils_1.parseJsonAs)(event.payload);
477
+ if (payload?.peerConnectionId && typeof payload.peerConnectionId === 'string' && payload?.iceConnectionState && typeof payload.iceConnectionState === 'string') {
478
+ const observedPeerConnection = this.observedPeerConnections.get(payload.peerConnectionId);
479
+ if (observedPeerConnection) {
480
+ observedPeerConnection.iceConnectionState = payload.iceConnectionState;
481
+ observedPeerConnection.emit('iceconnectionstatechange', {
482
+ state: payload.iceConnectionState,
483
+ });
484
+ }
485
+ else if (postBuffer) {
486
+ postBuffer.push(event);
487
+ }
488
+ else {
489
+ logger.warn('Received ICE_CONNECTION_STATE_CHANGED event without a corresponding observedPeerConnection: %o', event);
490
+ }
491
+ }
492
+ break;
493
+ }
494
+ case ClientEventTypes_1.ClientEventTypes.ICE_GATHERING_STATE_CHANGED: {
495
+ const payload = (0, utils_1.parseJsonAs)(event.payload);
496
+ if (payload?.peerConnectionId && typeof payload.peerConnectionId === 'string' && payload?.iceGatheringState && typeof payload.iceGatheringState === 'string') {
497
+ const observedPeerConnection = this.observedPeerConnections.get(payload.peerConnectionId);
498
+ if (observedPeerConnection) {
499
+ observedPeerConnection.iceGatheringState = payload.iceGatheringState;
500
+ observedPeerConnection.emit('icegatheringstatechange', {
501
+ state: payload.iceGatheringState,
502
+ });
503
+ }
504
+ else if (postBuffer) {
505
+ postBuffer.push(event);
506
+ }
507
+ else {
508
+ logger.warn('Received ICE_GATHERING_STATE_CHANGED event without a corresponding observedPeerConnection: %o', event);
509
+ }
510
+ }
511
+ break;
512
+ }
513
+ case ClientEventTypes_1.ClientEventTypes.PEER_CONNECTION_STATE_CHANGED: {
514
+ const payload = (0, utils_1.parseJsonAs)(event.payload);
515
+ if (payload?.peerConnectionId && typeof payload.peerConnectionId === 'string' && payload?.peerConnectionState && typeof payload.peerConnectionState === 'string') {
516
+ const observedPeerConnection = this.observedPeerConnections.get(payload.peerConnectionId);
517
+ if (observedPeerConnection) {
518
+ observedPeerConnection.connectionState = payload.peerConnectionState;
519
+ observedPeerConnection.emit('connectionstatechange', {
520
+ state: payload.peerConnectionState,
521
+ });
522
+ }
523
+ else if (postBuffer) {
524
+ postBuffer.push(event);
525
+ }
526
+ else {
527
+ logger.warn('Received PEER_CONNECTION_STATE_CHANGED event without a corresponding observedPeerConnection: %o', event);
528
+ }
134
529
  }
135
530
  break;
136
531
  }
137
532
  }
138
- this.call.observer.processors.events.process({
139
- call: this.call,
140
- client: this,
141
- data: event,
142
- });
533
+ this.emit('clientEvent', event);
143
534
  }
144
- processMetadata(metadata) {
535
+ injectMetaData(metaData) {
536
+ if (this.closed)
537
+ return;
538
+ if (!this._injections.clientMetaItems)
539
+ this._injections.clientMetaItems = [];
540
+ this._injections.clientMetaItems.push(metaData);
541
+ }
542
+ injectEvent(event) {
543
+ if (this.closed)
544
+ return;
545
+ if (!this._injections.clientEvents)
546
+ this._injections.clientEvents = [];
547
+ this._injections.clientEvents.push(event);
548
+ }
549
+ injectIssue(issue) {
550
+ if (this.closed)
551
+ return;
552
+ if (!this._injections.clientIssues)
553
+ this._injections.clientIssues = [];
554
+ this._injections.clientIssues.push(issue);
555
+ }
556
+ injectExtensionStat(stat) {
557
+ if (this.closed)
558
+ return;
559
+ if (!this._injections.extensionStats)
560
+ this._injections.extensionStats = [];
561
+ this._injections.extensionStats.push(stat);
562
+ }
563
+ injectAttachment(key, value) {
564
+ if (this.closed)
565
+ return;
566
+ if (!this._injections.attachments)
567
+ this._injections.attachments = {};
568
+ this._injections.attachments[key] = value;
569
+ }
570
+ addMetadata(metadata) {
571
+ if (this.closed)
572
+ return;
145
573
  switch (metadata.type) {
146
- case metaTypes_1.ClientMetaType.BROWSER: {
574
+ case ClientMetaTypes_1.ClientMetaTypes.BROWSER: {
147
575
  this.browser = (0, utils_1.parseJsonAs)(metadata.payload);
148
576
  break;
149
577
  }
150
- case metaTypes_1.ClientMetaType.ENGINE: {
578
+ case ClientMetaTypes_1.ClientMetaTypes.ENGINE: {
151
579
  this.engine = (0, utils_1.parseJsonAs)(metadata.payload);
152
580
  break;
153
581
  }
154
- case metaTypes_1.ClientMetaType.PLATFORM: {
582
+ case ClientMetaTypes_1.ClientMetaTypes.PLATFORM: {
155
583
  this.platform = (0, utils_1.parseJsonAs)(metadata.payload);
156
584
  break;
157
585
  }
158
- case metaTypes_1.ClientMetaType.OPERATION_SYSTEM: {
586
+ case ClientMetaTypes_1.ClientMetaTypes.OPERATION_SYSTEM: {
159
587
  this.operationSystem = (0, utils_1.parseJsonAs)(metadata.payload);
160
588
  break;
161
589
  }
162
590
  }
163
- this.call.observer.processors.metaData.process({
164
- call: this.call,
165
- client: this,
166
- data: metadata,
167
- });
591
+ this.call.observer.emit('client-metadata', this, metadata);
168
592
  }
169
- processIssue(issue) {
170
- this.call.observer.processors.issues.process({
171
- call: this.call,
172
- client: this,
173
- data: issue,
174
- });
593
+ addIssue(issue) {
594
+ if (this.closed)
595
+ return;
596
+ this.emit('issue', issue);
597
+ this.call.observer.emit('client-issue', this, issue);
175
598
  }
176
- processExtensionStats(stats) {
177
- this.call.observer.processors.extensionStats.process({
178
- call: this.call,
179
- client: this,
180
- data: stats,
181
- });
599
+ addExtensionStats(stats) {
600
+ this.call.observer.emit('client-extension-stats', this, stats);
601
+ this.emit('extensionStats', stats);
182
602
  }
183
603
  _updatePeerConnection(sample) {
184
604
  let observedPeerConnection = this.observedPeerConnections.get(sample.peerConnectionId);
185
605
  if (!observedPeerConnection) {
186
606
  if (!sample.peerConnectionId) {
187
- return logger.warn(`ObservedClient received an invalid PeerConnectionSample (missing peerConnectionId field). ClientId: ${this.clientId}, CallId: ${this.call.callId}`, sample);
607
+ return (logger.warn(`ObservedClient received an invalid PeerConnectionSample (missing peerConnectionId field). ClientId: ${this.clientId}, CallId: ${this.call.callId}`, sample), void 0);
188
608
  }
189
609
  observedPeerConnection = new ObservedPeerConnection_1.ObservedPeerConnection(sample.peerConnectionId, this);
190
610
  observedPeerConnection.once('close', () => {
191
611
  this.observedPeerConnections.delete(sample.peerConnectionId);
192
612
  });
193
613
  this.observedPeerConnections.set(sample.peerConnectionId, observedPeerConnection);
614
+ this.emit('newpeerconnection', observedPeerConnection);
194
615
  }
195
616
  observedPeerConnection.accept(sample);
617
+ return observedPeerConnection;
618
+ }
619
+ _mergeInjections(sample) {
620
+ if (this.closed)
621
+ return sample;
622
+ if (this._injections.clientEvents) {
623
+ if (!sample.clientEvents)
624
+ sample.clientEvents = [];
625
+ sample.clientEvents.push(...this._injections.clientEvents);
626
+ this._injections.clientEvents = undefined;
627
+ }
628
+ if (this._injections.clientIssues) {
629
+ if (!sample.clientIssues)
630
+ sample.clientIssues = [];
631
+ sample.clientIssues.push(...this._injections.clientIssues);
632
+ this._injections.clientIssues = undefined;
633
+ }
634
+ if (this._injections.extensionStats) {
635
+ if (!sample.extensionStats)
636
+ sample.extensionStats = [];
637
+ sample.extensionStats.push(...this._injections.extensionStats);
638
+ this._injections.extensionStats = undefined;
639
+ }
640
+ if (this._injections.attachments) {
641
+ if (!sample.attachments)
642
+ sample.attachments = {};
643
+ Object.assign(sample.attachments, this._injections.attachments);
644
+ this._injections.attachments = undefined;
645
+ }
646
+ if (this._injections.clientMetaItems) {
647
+ if (!sample.clientMetaItems)
648
+ sample.clientMetaItems = [];
649
+ sample.clientMetaItems.push(...this._injections.clientMetaItems);
650
+ this._injections.clientMetaItems = undefined;
651
+ }
652
+ return sample;
196
653
  }
197
654
  }
198
655
  exports.ObservedClient = ObservedClient;