@observertc/observer-js 1.0.1-4daea92.0 → 1.0.1-5a1b94b.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.
- package/README.md +535 -1
- package/lib/ObservedCall.d.ts +18 -2
- package/lib/ObservedCall.d.ts.map +1 -1
- package/lib/ObservedCall.js +65 -11
- package/lib/ObservedCallEventMonitor.d.ts +14 -13
- package/lib/ObservedCallEventMonitor.d.ts.map +1 -1
- package/lib/ObservedCallEventMonitor.js +3 -1
- package/lib/ObservedClient.d.ts +9 -9
- package/lib/ObservedClient.d.ts.map +1 -1
- package/lib/ObservedClient.js +181 -15
- package/lib/ObservedClientEventMonitor.d.ts +54 -52
- package/lib/ObservedClientEventMonitor.d.ts.map +1 -1
- package/lib/ObservedClientEventMonitor.js +7 -0
- package/lib/ObservedTURN.d.ts +1 -1
- package/lib/ObservedTURN.d.ts.map +1 -1
- package/lib/ObservedTURN.js +1 -0
- package/lib/ObservedTurnServer.d.ts +2 -2
- package/lib/ObservedTurnServer.d.ts.map +1 -1
- package/lib/Observer.d.ts +6 -5
- package/lib/Observer.d.ts.map +1 -1
- package/lib/Observer.js +13 -20
- package/lib/ObserverEventMonitor.d.ts +45 -13
- package/lib/ObserverEventMonitor.d.ts.map +1 -1
- package/lib/ObserverEventMonitor.js +114 -1
- package/lib/common/ObserverSummary.d.ts.map +1 -0
- package/lib/common/types.d.ts +20 -0
- package/lib/common/types.d.ts.map +1 -1
- package/lib/index.d.ts +17 -17
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +16 -16
- package/lib/mediasoup/ObservedMediasoupRouter.d.ts +7 -0
- package/lib/mediasoup/ObservedMediasoupRouter.d.ts.map +1 -0
- package/lib/mediasoup/ObservedMediasoupRouter.js +12 -0
- package/lib/schema/ClientEventTypes.d.ts +147 -79
- package/lib/schema/ClientEventTypes.d.ts.map +1 -1
- package/lib/schema/ClientEventTypes.js +5 -2
- package/lib/schema/ClientSample.d.ts +1 -1
- package/lib/schema/ClientSample.d.ts.map +1 -1
- package/lib/updaters/OnAnyCallObserverUpdater.d.ts.map +1 -1
- package/lib/utils/MediasoupRemoteTrackResolver.d.ts +2 -2
- package/lib/utils/MediasoupRemoteTrackResolver.d.ts.map +1 -1
- package/lib/utils/RemoteTrackResolver.d.ts +2 -2
- package/lib/utils/RemoteTrackResolver.d.ts.map +1 -1
- package/lib/{ObservedCertificate.d.ts → webrtc/ObservedCertificate.d.ts} +1 -1
- package/lib/webrtc/ObservedCertificate.d.ts.map +1 -0
- package/lib/{ObservedCodec.d.ts → webrtc/ObservedCodec.d.ts} +1 -1
- package/lib/webrtc/ObservedCodec.d.ts.map +1 -0
- package/lib/{ObservedDataChannel.d.ts → webrtc/ObservedDataChannel.d.ts} +1 -1
- package/lib/webrtc/ObservedDataChannel.d.ts.map +1 -0
- package/lib/{ObservedIceCandidate.d.ts → webrtc/ObservedIceCandidate.d.ts} +1 -1
- package/lib/webrtc/ObservedIceCandidate.d.ts.map +1 -0
- package/lib/{ObservedIceCandidatePair.d.ts → webrtc/ObservedIceCandidatePair.d.ts} +3 -2
- package/lib/webrtc/ObservedIceCandidatePair.d.ts.map +1 -0
- package/lib/{ObservedIceCandidatePair.js → webrtc/ObservedIceCandidatePair.js} +17 -1
- package/lib/{ObservedIceTransport.d.ts → webrtc/ObservedIceTransport.d.ts} +1 -1
- package/lib/webrtc/ObservedIceTransport.d.ts.map +1 -0
- package/lib/{ObservedInboundRtp.d.ts → webrtc/ObservedInboundRtp.d.ts} +2 -2
- package/lib/webrtc/ObservedInboundRtp.d.ts.map +1 -0
- package/lib/{ObservedInboundTrack.d.ts → webrtc/ObservedInboundTrack.d.ts} +5 -4
- package/lib/webrtc/ObservedInboundTrack.d.ts.map +1 -0
- package/lib/{ObservedInboundTrack.js → webrtc/ObservedInboundTrack.js} +2 -1
- package/lib/{ObservedMediaPlayout.d.ts → webrtc/ObservedMediaPlayout.d.ts} +2 -2
- package/lib/webrtc/ObservedMediaPlayout.d.ts.map +1 -0
- package/lib/{ObservedMediaSource.d.ts → webrtc/ObservedMediaSource.d.ts} +2 -2
- package/lib/webrtc/ObservedMediaSource.d.ts.map +1 -0
- package/lib/{ObservedOutboundRtp.d.ts → webrtc/ObservedOutboundRtp.d.ts} +2 -2
- package/lib/webrtc/ObservedOutboundRtp.d.ts.map +1 -0
- package/lib/{ObservedOutboundTrack.d.ts → webrtc/ObservedOutboundTrack.d.ts} +5 -4
- package/lib/webrtc/ObservedOutboundTrack.d.ts.map +1 -0
- package/lib/{ObservedOutboundTrack.js → webrtc/ObservedOutboundTrack.js} +2 -1
- package/lib/{ObservedPeerConnection.d.ts → webrtc/ObservedPeerConnection.d.ts} +26 -4
- package/lib/webrtc/ObservedPeerConnection.d.ts.map +1 -0
- package/lib/{ObservedPeerConnection.js → webrtc/ObservedPeerConnection.js} +80 -17
- package/lib/{ObservedPeerConnectionTransport.d.ts → webrtc/ObservedPeerConnectionTransport.d.ts} +1 -1
- package/lib/webrtc/ObservedPeerConnectionTransport.d.ts.map +1 -0
- package/lib/{ObservedRemoteInboundRtp.d.ts → webrtc/ObservedRemoteInboundRtp.d.ts} +2 -2
- package/lib/webrtc/ObservedRemoteInboundRtp.d.ts.map +1 -0
- package/lib/{ObservedRemoteOutboundRtp.d.ts → webrtc/ObservedRemoteOutboundRtp.d.ts} +2 -2
- package/lib/webrtc/ObservedRemoteOutboundRtp.d.ts.map +1 -0
- package/package.json +1 -1
- package/src/ObservedCall.ts +70 -17
- package/src/ObservedCallEventMonitor.ts +17 -14
- package/src/ObservedClient.ts +195 -22
- package/src/ObservedClientEventMonitor.ts +59 -51
- package/src/ObservedTURN.ts +2 -1
- package/src/ObservedTurnServer.ts +2 -2
- package/src/Observer.ts +22 -27
- package/src/ObserverEventMonitor.ts +167 -14
- package/src/common/types.ts +20 -1
- package/src/index.ts +18 -19
- package/src/mediasoup/ObservedMediasoupRouter.ts +12 -0
- package/src/schema/ClientEventTypes.ts +187 -83
- package/src/schema/ClientSample.ts +1 -1
- package/src/updaters/OnAnyCallObserverUpdater.ts +1 -1
- package/src/utils/MediasoupRemoteTrackResolver.ts +2 -2
- package/src/utils/RemoteTrackResolver.ts +2 -2
- package/src/{ObservedCertificate.ts → webrtc/ObservedCertificate.ts} +1 -1
- package/src/{ObservedCodec.ts → webrtc/ObservedCodec.ts} +1 -1
- package/src/{ObservedDataChannel.ts → webrtc/ObservedDataChannel.ts} +1 -1
- package/src/{ObservedIceCandidate.ts → webrtc/ObservedIceCandidate.ts} +1 -1
- package/src/{ObservedIceCandidatePair.ts → webrtc/ObservedIceCandidatePair.ts} +19 -3
- package/src/{ObservedIceTransport.ts → webrtc/ObservedIceTransport.ts} +1 -1
- package/src/{ObservedInboundRtp.ts → webrtc/ObservedInboundRtp.ts} +2 -2
- package/src/{ObservedInboundTrack.ts → webrtc/ObservedInboundTrack.ts} +6 -4
- package/src/{ObservedMediaPlayout.ts → webrtc/ObservedMediaPlayout.ts} +2 -2
- package/src/{ObservedMediaSource.ts → webrtc/ObservedMediaSource.ts} +2 -2
- package/src/{ObservedOutboundRtp.ts → webrtc/ObservedOutboundRtp.ts} +2 -2
- package/src/{ObservedOutboundTrack.ts → webrtc/ObservedOutboundTrack.ts} +6 -4
- package/src/{ObservedPeerConnection.ts → webrtc/ObservedPeerConnection.ts} +122 -37
- package/src/{ObservedPeerConnectionTransport.ts → webrtc/ObservedPeerConnectionTransport.ts} +1 -1
- package/src/{ObservedRemoteInboundRtp.ts → webrtc/ObservedRemoteInboundRtp.ts} +2 -2
- package/src/{ObservedRemoteOutboundRtp.ts → webrtc/ObservedRemoteOutboundRtp.ts} +2 -2
- package/lib/ObservedCertificate.d.ts.map +0 -1
- package/lib/ObservedCodec.d.ts.map +0 -1
- package/lib/ObservedDataChannel.d.ts.map +0 -1
- package/lib/ObservedIceCandidate.d.ts.map +0 -1
- package/lib/ObservedIceCandidatePair.d.ts.map +0 -1
- package/lib/ObservedIceTransport.d.ts.map +0 -1
- package/lib/ObservedInboundRtp.d.ts.map +0 -1
- package/lib/ObservedInboundTrack.d.ts.map +0 -1
- package/lib/ObservedMediaPlayout.d.ts.map +0 -1
- package/lib/ObservedMediaSource.d.ts.map +0 -1
- package/lib/ObservedOutboundRtp.d.ts.map +0 -1
- package/lib/ObservedOutboundTrack.d.ts.map +0 -1
- package/lib/ObservedPeerConnection.d.ts.map +0 -1
- package/lib/ObservedPeerConnectionTransport.d.ts.map +0 -1
- package/lib/ObservedRemoteInboundRtp.d.ts.map +0 -1
- package/lib/ObservedRemoteOutboundRtp.d.ts.map +0 -1
- package/lib/ObserverSummary.d.ts.map +0 -1
- /package/lib/{ObserverSummary.d.ts → common/ObserverSummary.d.ts} +0 -0
- /package/lib/{ObserverSummary.js → common/ObserverSummary.js} +0 -0
- /package/lib/{ObservedCertificate.js → webrtc/ObservedCertificate.js} +0 -0
- /package/lib/{ObservedCodec.js → webrtc/ObservedCodec.js} +0 -0
- /package/lib/{ObservedDataChannel.js → webrtc/ObservedDataChannel.js} +0 -0
- /package/lib/{ObservedIceCandidate.js → webrtc/ObservedIceCandidate.js} +0 -0
- /package/lib/{ObservedIceTransport.js → webrtc/ObservedIceTransport.js} +0 -0
- /package/lib/{ObservedInboundRtp.js → webrtc/ObservedInboundRtp.js} +0 -0
- /package/lib/{ObservedMediaPlayout.js → webrtc/ObservedMediaPlayout.js} +0 -0
- /package/lib/{ObservedMediaSource.js → webrtc/ObservedMediaSource.js} +0 -0
- /package/lib/{ObservedOutboundRtp.js → webrtc/ObservedOutboundRtp.js} +0 -0
- /package/lib/{ObservedPeerConnectionTransport.js → webrtc/ObservedPeerConnectionTransport.js} +0 -0
- /package/lib/{ObservedRemoteInboundRtp.js → webrtc/ObservedRemoteInboundRtp.js} +0 -0
- /package/lib/{ObservedRemoteOutboundRtp.js → webrtc/ObservedRemoteOutboundRtp.js} +0 -0
- /package/src/{ObserverSummary.ts → common/ObserverSummary.ts} +0 -0
package/lib/ObservedCall.js
CHANGED
|
@@ -9,6 +9,8 @@ const OnAllClientCallUpdater_1 = require("./updaters/OnAllClientCallUpdater");
|
|
|
9
9
|
const OnIntervalUpdater_1 = require("./updaters/OnIntervalUpdater");
|
|
10
10
|
const OnAnyClientCallUpdater_1 = require("./updaters/OnAnyClientCallUpdater");
|
|
11
11
|
const ObservedCallEventMonitor_1 = require("./ObservedCallEventMonitor");
|
|
12
|
+
const logger_1 = require("./common/logger");
|
|
13
|
+
const logger = (0, logger_1.createLogger)('ObservedCall');
|
|
12
14
|
class ObservedCall extends events_1.EventEmitter {
|
|
13
15
|
observer;
|
|
14
16
|
detectors;
|
|
@@ -43,6 +45,19 @@ class ObservedCall extends events_1.EventEmitter {
|
|
|
43
45
|
numberOfDataChannels = 0;
|
|
44
46
|
maxNumberOfClients = 0;
|
|
45
47
|
deltaNumberOfIssues = 0;
|
|
48
|
+
deltaDataChannelBytesReceived = 0;
|
|
49
|
+
deltaDataChannelBytesSent = 0;
|
|
50
|
+
deltaDataChannelMessagesReceived = 0;
|
|
51
|
+
deltaDataChannelMessagesSent = 0;
|
|
52
|
+
deltaInboundPacketsLost = 0;
|
|
53
|
+
deltaInboundPacketsReceived = 0;
|
|
54
|
+
deltaOutboundPacketsSent = 0;
|
|
55
|
+
deltaReceivedAudioBytes = 0;
|
|
56
|
+
deltaReceivedVideoBytes = 0;
|
|
57
|
+
deltaSentAudioBytes = 0;
|
|
58
|
+
deltaSentVideoBytes = 0;
|
|
59
|
+
deltaTransportReceivedBytes = 0;
|
|
60
|
+
deltaTransportSentBytes = 0;
|
|
46
61
|
deltaRttLt50Measurements = 0;
|
|
47
62
|
deltaRttLt150Measurements = 0;
|
|
48
63
|
deltaRttLt300Measurements = 0;
|
|
@@ -52,8 +67,9 @@ class ObservedCall extends events_1.EventEmitter {
|
|
|
52
67
|
startedAt;
|
|
53
68
|
endedAt;
|
|
54
69
|
closedAt;
|
|
55
|
-
|
|
56
|
-
|
|
70
|
+
lastClientTimestamp = 0;
|
|
71
|
+
maxIdleIfEmptyMs;
|
|
72
|
+
_autoCloseTimer;
|
|
57
73
|
constructor(settings, observer) {
|
|
58
74
|
super();
|
|
59
75
|
this.observer = observer;
|
|
@@ -61,6 +77,7 @@ class ObservedCall extends events_1.EventEmitter {
|
|
|
61
77
|
this.callId = settings.callId;
|
|
62
78
|
this.appData = settings.appData ?? {};
|
|
63
79
|
this.scoreCalculator = new DefaultCallScoreCalculator_1.DefaultCallScoreCalculator(this);
|
|
80
|
+
this.maxIdleIfEmptyMs = settings.maxIdleIfEmptyMs;
|
|
64
81
|
this.detectors = new Detectors_1.Detectors();
|
|
65
82
|
if (settings.updateIntervalInMs) {
|
|
66
83
|
if (settings.updatePolicy !== 'update-on-interval') {
|
|
@@ -69,10 +86,10 @@ class ObservedCall extends events_1.EventEmitter {
|
|
|
69
86
|
}
|
|
70
87
|
switch (settings.updatePolicy) {
|
|
71
88
|
case 'update-on-any-client-updated':
|
|
72
|
-
this.updater = new
|
|
89
|
+
this.updater = new OnAnyClientCallUpdater_1.OnAnyClientCallUpdater(this);
|
|
73
90
|
break;
|
|
74
91
|
case 'update-when-all-client-updated':
|
|
75
|
-
this.updater = new
|
|
92
|
+
this.updater = new OnAllClientCallUpdater_1.OnAllClientCallUpdater(this);
|
|
76
93
|
break;
|
|
77
94
|
case 'update-on-interval':
|
|
78
95
|
if (!settings.updateIntervalInMs) {
|
|
@@ -85,12 +102,6 @@ class ObservedCall extends events_1.EventEmitter {
|
|
|
85
102
|
case 'mediasoup-sfu':
|
|
86
103
|
break;
|
|
87
104
|
}
|
|
88
|
-
this._callStartedEvent = {
|
|
89
|
-
emitted: false,
|
|
90
|
-
};
|
|
91
|
-
this._callEndedEvent = {
|
|
92
|
-
emitted: false,
|
|
93
|
-
};
|
|
94
105
|
}
|
|
95
106
|
get numberOfClients() {
|
|
96
107
|
return this.observedClients.size;
|
|
@@ -104,7 +115,19 @@ class ObservedCall extends events_1.EventEmitter {
|
|
|
104
115
|
this.update(); // last update before closing
|
|
105
116
|
this.closed = true;
|
|
106
117
|
this.updater?.close();
|
|
107
|
-
|
|
118
|
+
let minSampleTimestamps;
|
|
119
|
+
let maxSampleTimestamps;
|
|
120
|
+
for (const client of this.observedClients.values()) {
|
|
121
|
+
client.close();
|
|
122
|
+
if (client.joinedAt)
|
|
123
|
+
minSampleTimestamps = Math.min(minSampleTimestamps ?? client.joinedAt, client.joinedAt);
|
|
124
|
+
if (client.leftAt)
|
|
125
|
+
maxSampleTimestamps = Math.max(maxSampleTimestamps ?? client.leftAt, client.leftAt);
|
|
126
|
+
}
|
|
127
|
+
if (this.startedAt === undefined)
|
|
128
|
+
this.startedAt = minSampleTimestamps;
|
|
129
|
+
if (this.endedAt === undefined)
|
|
130
|
+
this.endedAt = maxSampleTimestamps;
|
|
108
131
|
this.closedAt = Date.now();
|
|
109
132
|
this.emit('close');
|
|
110
133
|
}
|
|
@@ -130,6 +153,7 @@ class ObservedCall extends events_1.EventEmitter {
|
|
|
130
153
|
this.observedClients.delete(settings.clientId);
|
|
131
154
|
if (this.observedClients.size === 0) {
|
|
132
155
|
this.emit('empty');
|
|
156
|
+
this._createAutoClose();
|
|
133
157
|
}
|
|
134
158
|
++this.totalRemovedClients;
|
|
135
159
|
});
|
|
@@ -142,6 +166,8 @@ class ObservedCall extends events_1.EventEmitter {
|
|
|
142
166
|
this.emit('newclient', result);
|
|
143
167
|
if (wasEmpty) {
|
|
144
168
|
this.emit('not-empty');
|
|
169
|
+
clearTimeout(this._autoCloseTimer);
|
|
170
|
+
this._autoCloseTimer = undefined;
|
|
145
171
|
}
|
|
146
172
|
return result;
|
|
147
173
|
}
|
|
@@ -163,12 +189,26 @@ class ObservedCall extends events_1.EventEmitter {
|
|
|
163
189
|
}
|
|
164
190
|
this.detectors.update();
|
|
165
191
|
this.scoreCalculator.update();
|
|
192
|
+
this.lastClientTimestamp = Math.max(...Array.from(this.observedClients.values()).map((c) => c.lastSampleTimestamp ?? 0));
|
|
166
193
|
this.emit('update');
|
|
167
194
|
this.deltaNumberOfIssues = 0;
|
|
168
195
|
this.deltaRttLt50Measurements = 0;
|
|
169
196
|
this.deltaRttLt150Measurements = 0;
|
|
170
197
|
this.deltaRttLt300Measurements = 0;
|
|
171
198
|
this.deltaRttGtOrEq300Measurements = 0;
|
|
199
|
+
this.deltaDataChannelBytesReceived = 0;
|
|
200
|
+
this.deltaDataChannelBytesSent = 0;
|
|
201
|
+
this.deltaDataChannelMessagesReceived = 0;
|
|
202
|
+
this.deltaDataChannelMessagesSent = 0;
|
|
203
|
+
this.deltaInboundPacketsLost = 0;
|
|
204
|
+
this.deltaInboundPacketsReceived = 0;
|
|
205
|
+
this.deltaOutboundPacketsSent = 0;
|
|
206
|
+
this.deltaReceivedAudioBytes = 0;
|
|
207
|
+
this.deltaReceivedVideoBytes = 0;
|
|
208
|
+
this.deltaSentAudioBytes = 0;
|
|
209
|
+
this.deltaSentVideoBytes = 0;
|
|
210
|
+
this.deltaTransportReceivedBytes = 0;
|
|
211
|
+
this.deltaTransportSentBytes = 0;
|
|
172
212
|
}
|
|
173
213
|
_onClientUpdate(client) {
|
|
174
214
|
this.totalClientsReceivedAudioBytes += client.deltaReceivedAudioBytes;
|
|
@@ -203,5 +243,19 @@ class ObservedCall extends events_1.EventEmitter {
|
|
|
203
243
|
return;
|
|
204
244
|
this.endedAt = Math.max(this.endedAt ?? client.leftAt, client.leftAt);
|
|
205
245
|
}
|
|
246
|
+
_createAutoClose() {
|
|
247
|
+
if (this.closed)
|
|
248
|
+
return;
|
|
249
|
+
if (this.maxIdleIfEmptyMs === undefined || this.maxIdleIfEmptyMs < 1)
|
|
250
|
+
return;
|
|
251
|
+
this._autoCloseTimer = setTimeout(() => {
|
|
252
|
+
if (this.closed)
|
|
253
|
+
return;
|
|
254
|
+
if (this.observedClients.size > 0)
|
|
255
|
+
return;
|
|
256
|
+
logger.debug(`Call ${this.callId} is empty for ${this.maxIdleIfEmptyMs}ms, closing...`);
|
|
257
|
+
this.close();
|
|
258
|
+
}, this.maxIdleIfEmptyMs);
|
|
259
|
+
}
|
|
206
260
|
}
|
|
207
261
|
exports.ObservedCall = ObservedCall;
|
|
@@ -1,23 +1,24 @@
|
|
|
1
1
|
import { ObservedCall } from './ObservedCall';
|
|
2
|
-
import { ObservedCertificate } from './ObservedCertificate';
|
|
2
|
+
import { ObservedCertificate } from './webrtc/ObservedCertificate';
|
|
3
3
|
import { ObservedClient } from './ObservedClient';
|
|
4
|
-
import { ObservedCodec } from './ObservedCodec';
|
|
5
|
-
import { ObservedDataChannel } from './ObservedDataChannel';
|
|
6
|
-
import { ObservedIceCandidate } from './ObservedIceCandidate';
|
|
7
|
-
import { ObservedIceCandidatePair } from './ObservedIceCandidatePair';
|
|
8
|
-
import { ObservedIceTransport } from './ObservedIceTransport';
|
|
9
|
-
import { ObservedInboundRtp } from './ObservedInboundRtp';
|
|
10
|
-
import { ObservedInboundTrack } from './ObservedInboundTrack';
|
|
11
|
-
import { ObservedMediaPlayout } from './ObservedMediaPlayout';
|
|
12
|
-
import { ObservedMediaSource } from './ObservedMediaSource';
|
|
13
|
-
import { ObservedOutboundRtp } from './ObservedOutboundRtp';
|
|
14
|
-
import { ObservedOutboundTrack } from './ObservedOutboundTrack';
|
|
15
|
-
import { ObservedPeerConnection } from './ObservedPeerConnection';
|
|
4
|
+
import { ObservedCodec } from './webrtc/ObservedCodec';
|
|
5
|
+
import { ObservedDataChannel } from './webrtc/ObservedDataChannel';
|
|
6
|
+
import { ObservedIceCandidate } from './webrtc/ObservedIceCandidate';
|
|
7
|
+
import { ObservedIceCandidatePair } from './webrtc/ObservedIceCandidatePair';
|
|
8
|
+
import { ObservedIceTransport } from './webrtc/ObservedIceTransport';
|
|
9
|
+
import { ObservedInboundRtp } from './webrtc/ObservedInboundRtp';
|
|
10
|
+
import { ObservedInboundTrack } from './webrtc/ObservedInboundTrack';
|
|
11
|
+
import { ObservedMediaPlayout } from './webrtc/ObservedMediaPlayout';
|
|
12
|
+
import { ObservedMediaSource } from './webrtc/ObservedMediaSource';
|
|
13
|
+
import { ObservedOutboundRtp } from './webrtc/ObservedOutboundRtp';
|
|
14
|
+
import { ObservedOutboundTrack } from './webrtc/ObservedOutboundTrack';
|
|
15
|
+
import { ObservedPeerConnection } from './webrtc/ObservedPeerConnection';
|
|
16
16
|
import { ClientEvent, ClientIssue, ClientMetaData, ClientSample, ExtensionStat } from './schema/ClientSample';
|
|
17
17
|
export declare class ObservedCallEventMonitor<Context> {
|
|
18
18
|
readonly call: ObservedCall;
|
|
19
19
|
readonly context: Context;
|
|
20
20
|
constructor(call: ObservedCall, context: Context);
|
|
21
|
+
onCallClosed?: (call: ObservedCall, ctx: Context) => void;
|
|
21
22
|
onCallEmpty?: (call: ObservedCall, ctx: Context) => void;
|
|
22
23
|
onCallNotEmpty?: (call: ObservedCall, ctx: Context) => void;
|
|
23
24
|
onCallUpdated?: (call: ObservedCall, ctx: Context) => void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ObservedCallEventMonitor.d.ts","sourceRoot":"","sources":["../src/ObservedCallEventMonitor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,mBAAmB,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"ObservedCallEventMonitor.d.ts","sourceRoot":"","sources":["../src/ObservedCallEventMonitor.ts"],"names":[],"mappings":"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"}
|
|
@@ -46,6 +46,7 @@ class ObservedCallEventMonitor {
|
|
|
46
46
|
this._onCallAdded(call);
|
|
47
47
|
}
|
|
48
48
|
// Public event handlers
|
|
49
|
+
onCallClosed;
|
|
49
50
|
onCallEmpty;
|
|
50
51
|
onCallNotEmpty;
|
|
51
52
|
onCallUpdated;
|
|
@@ -100,6 +101,7 @@ class ObservedCallEventMonitor {
|
|
|
100
101
|
call.off('empty', onCallEmpty);
|
|
101
102
|
call.off('not-empty', onCallNotEmpty);
|
|
102
103
|
call.off('update', onCallUpdated);
|
|
104
|
+
this.onCallClosed?.(call, this.context);
|
|
103
105
|
});
|
|
104
106
|
call.on('newclient', this._onClientAdded);
|
|
105
107
|
call.on('empty', onCallEmpty);
|
|
@@ -115,7 +117,7 @@ class ObservedCallEventMonitor {
|
|
|
115
117
|
const onClientExtensionStats = (extensionStats) => this._onClientExtensionStats(observedClient, extensionStats);
|
|
116
118
|
const onUsingTurn = (usingTurn) => this._onUsingTurn(observedClient, usingTurn);
|
|
117
119
|
const onUserMediaError = (error) => this._onUserMediaError(observedClient, error);
|
|
118
|
-
const onClientUpdated = (...args) => this.onClientUpdated?.(observedClient, args[0]
|
|
120
|
+
const onClientUpdated = (...args) => this.onClientUpdated?.(observedClient, args[0], this.context);
|
|
119
121
|
const onClientEvent = (event) => this.onClientEvent?.(observedClient, event, this.context);
|
|
120
122
|
observedClient.once('close', () => {
|
|
121
123
|
observedClient.off('newpeerconnection', this._onPeerConnconnectionAdded);
|
package/lib/ObservedClient.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/// <reference types="node" />
|
|
2
2
|
import { EventEmitter } from 'events';
|
|
3
|
-
import { ObservedPeerConnection } from './ObservedPeerConnection';
|
|
3
|
+
import { ObservedPeerConnection } from './webrtc/ObservedPeerConnection';
|
|
4
4
|
import { ClientEvent, ClientMetaData, ClientSample, ClientIssue, ExtensionStat } from './schema/ClientSample';
|
|
5
5
|
import * as MetaData from './schema/ClientMetaTypes';
|
|
6
6
|
import { ObservedCall } from './ObservedCall';
|
|
@@ -8,15 +8,11 @@ import { CalculatedScore } from './scores/CalculatedScore';
|
|
|
8
8
|
import { Detectors } from './detectors/Detectors';
|
|
9
9
|
export type ObservedClientSettings<AppData extends Record<string, unknown> = Record<string, unknown>> = {
|
|
10
10
|
clientId: string;
|
|
11
|
+
maxIdleTimeMs?: number;
|
|
11
12
|
appData?: AppData;
|
|
12
13
|
};
|
|
13
14
|
export type ObservedClientEvents = {
|
|
14
|
-
update: [
|
|
15
|
-
{
|
|
16
|
-
sample: ClientSample;
|
|
17
|
-
elapsedTimeInMs: number;
|
|
18
|
-
}
|
|
19
|
-
];
|
|
15
|
+
update: [sample: ClientSample, elapsedTimeInMs: number];
|
|
20
16
|
close: [];
|
|
21
17
|
joined: [];
|
|
22
18
|
issue: [ClientIssue];
|
|
@@ -36,12 +32,11 @@ export declare interface ObservedClient {
|
|
|
36
32
|
emit<U extends keyof ObservedClientEvents>(event: U, ...args: ObservedClientEvents[U]): boolean;
|
|
37
33
|
}
|
|
38
34
|
export declare class ObservedClient<AppData extends Record<string, unknown> = Record<string, unknown>> extends EventEmitter {
|
|
35
|
+
readonly settings: ObservedClientSettings<AppData>;
|
|
39
36
|
readonly call: ObservedCall;
|
|
40
37
|
readonly detectors: Detectors;
|
|
41
|
-
readonly clientId: string;
|
|
42
38
|
readonly observedPeerConnections: Map<string, ObservedPeerConnection>;
|
|
43
39
|
readonly calculatedScore: CalculatedScore;
|
|
44
|
-
appData: AppData;
|
|
45
40
|
attachments?: Record<string, unknown>;
|
|
46
41
|
updated: number;
|
|
47
42
|
acceptedSamples: number;
|
|
@@ -49,6 +44,7 @@ export declare class ObservedClient<AppData extends Record<string, unknown> = Re
|
|
|
49
44
|
joinedAt?: number;
|
|
50
45
|
leftAt?: number;
|
|
51
46
|
closedAt?: number;
|
|
47
|
+
lastSampleTimestamp?: number;
|
|
52
48
|
operationSystem?: MetaData.OperationSystem;
|
|
53
49
|
engine?: MetaData.Engine;
|
|
54
50
|
platform?: MetaData.Platform;
|
|
@@ -111,10 +107,14 @@ export declare class ObservedClient<AppData extends Record<string, unknown> = Re
|
|
|
111
107
|
readonly mediaDevices: MetaData.MediaDeviceInfo[];
|
|
112
108
|
issues: ClientIssue[];
|
|
113
109
|
private _injections;
|
|
110
|
+
private _autoCloseTimer?;
|
|
114
111
|
constructor(settings: ObservedClientSettings<AppData>, call: ObservedCall);
|
|
112
|
+
get clientId(): string;
|
|
113
|
+
get appData(): AppData;
|
|
115
114
|
get numberOfPeerConnections(): number;
|
|
116
115
|
get score(): number | undefined;
|
|
117
116
|
close(): void;
|
|
117
|
+
private _createAutoClose;
|
|
118
118
|
accept(sample: ClientSample): void;
|
|
119
119
|
private _processClientEvent;
|
|
120
120
|
injectMetaData(metaData: ClientMetaData): void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ObservedClient.d.ts","sourceRoot":"","sources":["../src/ObservedClient.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,EAAE,sBAAsB,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"ObservedClient.d.ts","sourceRoot":"","sources":["../src/ObservedClient.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,EAAE,sBAAsB,EAAE,MAAM,iCAAiC,CAAC;AAGzE,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,YAAY,EAAwB,WAAW,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACpI,OAAO,KAAK,QAAQ,MAAM,0BAA0B,CAAC;AAErD,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAG9C,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAC3D,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAMlD,MAAM,MAAM,sBAAsB,CAAC,OAAO,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,IAAI;IACvG,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,OAAO,CAAC,EAAE,OAAO,CAAC;CAClB,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG;IAClC,MAAM,EAAE,CAAC,MAAM,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,CAAC,CAAC;IACxD,KAAK,EAAE,EAAE,CAAC;IACV,MAAM,EAAE,EAAE,CAAC;IACX,KAAK,EAAE,CAAC,WAAW,CAAC,CAAC;IACrB,QAAQ,EAAE,CAAC,cAAc,CAAC,CAAC;IAC3B,QAAQ,EAAE,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;IAC9B,IAAI,EAAE,EAAE,CAAC;IACT,SAAS,EAAE,CAAC,OAAO,CAAC,CAAC;IACrB,cAAc,EAAE,CAAC,MAAM,CAAC,CAAC;IACzB,cAAc,EAAE,CAAC,aAAa,CAAC,CAAC;IAChC,WAAW,EAAE,CAAC,WAAW,CAAC,CAAC;IAE3B,iBAAiB,EAAE,CAAC,sBAAsB,CAAC,CAAC;CAC5C,CAAC;AAEF,MAAM,CAAC,OAAO,WAAW,cAAc;IACtC,EAAE,CAAC,CAAC,SAAS,MAAM,oBAAoB,EAAE,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,GAAG,IAAI,EAAE,oBAAoB,CAAC,CAAC,CAAC,KAAK,IAAI,GAAG,IAAI,CAAC;IAC/G,GAAG,CAAC,CAAC,SAAS,MAAM,oBAAoB,EAAE,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,GAAG,IAAI,EAAE,oBAAoB,CAAC,CAAC,CAAC,KAAK,IAAI,GAAG,IAAI,CAAC;IAChH,IAAI,CAAC,CAAC,SAAS,MAAM,oBAAoB,EAAE,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,GAAG,IAAI,EAAE,oBAAoB,CAAC,CAAC,CAAC,KAAK,IAAI,GAAG,IAAI,CAAC;IACjH,IAAI,CAAC,CAAC,SAAS,MAAM,oBAAoB,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,IAAI,EAAE,oBAAoB,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC;CAChG;AAED,qBAAa,cAAc,CAAC,OAAO,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAE,SAAQ,YAAY;aA+FjG,QAAQ,EAAE,sBAAsB,CAAC,OAAO,CAAC;aACzC,IAAI,EAAE,YAAY;IA/FnC,SAAgB,SAAS,EAAE,SAAS,CAAC;IAErC,SAAgB,uBAAuB,sCAA6C;IACpF,SAAgB,eAAe,EAAE,eAAe,CAG9C;IAEK,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAEtC,OAAO,SAAc;IACrB,eAAe,SAAK;IACpB,MAAM,UAAS;IAEf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAE7B,eAAe,CAAC,EAAE,QAAQ,CAAC,eAAe,CAAC;IAC3C,MAAM,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC;IACzB,QAAQ,CAAC,EAAE,QAAQ,CAAC,QAAQ,CAAC;IAC7B,OAAO,CAAC,EAAE,QAAQ,CAAC,OAAO,CAAC;IAC3B,gBAAgB,EAAE,MAAM,EAAE,CAAM;IAEhC,SAAS,UAAS;IAClB,QAAQ,UAAS;IACjB,wBAAwB,SAAK;IAC7B,wBAAwB,SAAK;IAE7B,uBAAuB,SAAK;IAC5B,2BAA2B,SAAK;IAChC,wBAAwB,SAAK;IAC7B,yBAAyB,SAAK;IAC9B,6BAA6B,SAAK;IAClC,4BAA4B,SAAK;IACjC,gCAAgC,SAAK;IACrC,uBAAuB,SAAK;IAC5B,uBAAuB,SAAK;IAC5B,mBAAmB,SAAK;IACxB,mBAAmB,SAAK;IACxB,cAAc,SAAK;IACnB,kBAAkB,SAAK;IAEvB,uBAAuB,SAAK;IAC5B,uBAAuB,SAAK;IAC5B,mBAAmB,SAAK;IACxB,mBAAmB,SAAK;IACxB,yBAAyB,SAAK;IAC9B,6BAA6B,SAAK;IAClC,4BAA4B,SAAK;IACjC,gCAAgC,SAAK;IACrC,uBAAuB,SAAK;IAC5B,2BAA2B,SAAK;IAChC,wBAAwB,SAAK;IAC7B,uBAAuB,SAAK;IAC5B,2BAA2B,SAAK;IAChC,wBAAwB,SAAK;IAC7B,yBAAyB,SAAK;IAC9B,yBAAyB,SAAK;IAC9B,6BAA6B,SAAK;IAElC,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAE3B,mBAAmB,SAAK;IACxB,mBAAmB,SAAK;IACxB,qBAAqB,SAAK;IAC1B,qBAAqB,SAAK;IAE1B,yBAAyB,SAAK;IAC9B,oBAAoB,SAAK;IACzB,0BAA0B,SAAK;IAC/B,sBAAsB,SAAK;IAC3B,oBAAoB,SAAK;IAEzB,wBAAwB,SAAK;IAC7B,yBAAyB,SAAK;IAC9B,yBAAyB,SAAK;IAC9B,6BAA6B,SAAK;IAClC,mBAAmB,SAAK;IAExB,aAAa,SAAK;IAClB,yBAAyB,SAAK;IAC9B,mBAAmB,SAAK;IAE/B,SAAgB,YAAY,EAAE,QAAQ,CAAC,eAAe,EAAE,CAAM;IACvD,MAAM,EAAE,WAAW,EAAE,CAAM;IAElC,OAAO,CAAC,WAAW,CAAkH;IACrI,OAAO,CAAC,eAAe,CAAC,CAAgC;gBAGvC,QAAQ,EAAE,sBAAsB,CAAC,OAAO,CAAC,EACzC,IAAI,EAAE,YAAY;IASnC,IAAW,QAAQ,WAElB;IAED,IAAW,OAAO,IAAI,OAAO,CAE5B;IAED,IAAW,uBAAuB,WAEjC;IAED,IAAW,KAAK,uBAEf;IAEM,KAAK;IAsBZ,OAAO,CAAC,gBAAgB;IAcjB,MAAM,CAAC,MAAM,EAAE,YAAY,GAAG,IAAI;IA+KzC,OAAO,CAAC,mBAAmB;IAoPpB,cAAc,CAAC,QAAQ,EAAE,cAAc;IAQvC,WAAW,CAAC,KAAK,EAAE,WAAW;IAQ9B,WAAW,CAAC,KAAK,EAAE,WAAW;IAQ9B,mBAAmB,CAAC,IAAI,EAAE,aAAa;IAQvC,gBAAgB,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO;IAS5C,WAAW,CAAC,QAAQ,EAAE,cAAc;IAqDpC,QAAQ,CAAC,KAAK,EAAE,WAAW;IAO3B,iBAAiB,CAAC,KAAK,EAAE,aAAa;IAK7C,OAAO,CAAC,qBAAqB;IA0B7B,OAAO,CAAC,gBAAgB;CAwFxB"}
|
package/lib/ObservedClient.js
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
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
7
|
const ClientEventTypes_1 = require("./schema/ClientEventTypes");
|
|
8
8
|
const ClientMetaTypes_1 = require("./schema/ClientMetaTypes");
|
|
@@ -10,15 +10,14 @@ 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;
|
|
@@ -26,6 +25,7 @@ class ObservedClient extends events_1.EventEmitter {
|
|
|
26
25
|
joinedAt;
|
|
27
26
|
leftAt;
|
|
28
27
|
closedAt;
|
|
28
|
+
lastSampleTimestamp;
|
|
29
29
|
// the timestamp of the CLIENT_JOINED event
|
|
30
30
|
operationSystem;
|
|
31
31
|
engine;
|
|
@@ -89,14 +89,21 @@ class ObservedClient extends events_1.EventEmitter {
|
|
|
89
89
|
mediaDevices = [];
|
|
90
90
|
issues = [];
|
|
91
91
|
_injections = {};
|
|
92
|
+
_autoCloseTimer;
|
|
92
93
|
constructor(settings, call) {
|
|
93
94
|
super();
|
|
95
|
+
this.settings = settings;
|
|
94
96
|
this.call = call;
|
|
95
97
|
this.setMaxListeners(Infinity);
|
|
96
|
-
this.
|
|
97
|
-
this.appData = settings.appData ?? {};
|
|
98
|
+
this._createAutoClose();
|
|
98
99
|
this.detectors = new Detectors_1.Detectors();
|
|
99
100
|
}
|
|
101
|
+
get clientId() {
|
|
102
|
+
return this.settings.clientId;
|
|
103
|
+
}
|
|
104
|
+
get appData() {
|
|
105
|
+
return this.settings.appData ?? {};
|
|
106
|
+
}
|
|
100
107
|
get numberOfPeerConnections() {
|
|
101
108
|
return this.observedPeerConnections.size;
|
|
102
109
|
}
|
|
@@ -107,13 +114,37 @@ class ObservedClient extends events_1.EventEmitter {
|
|
|
107
114
|
if (this.closed)
|
|
108
115
|
return;
|
|
109
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));
|
|
110
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
|
+
}
|
|
111
128
|
this.closedAt = Date.now();
|
|
112
129
|
this.emit('close');
|
|
113
130
|
}
|
|
131
|
+
_createAutoClose() {
|
|
132
|
+
if (this.closed)
|
|
133
|
+
return;
|
|
134
|
+
if (this.settings.maxIdleTimeMs === undefined || this.settings.maxIdleTimeMs < 1)
|
|
135
|
+
return;
|
|
136
|
+
clearTimeout(this._autoCloseTimer);
|
|
137
|
+
this._autoCloseTimer = setTimeout(() => {
|
|
138
|
+
if (this.closed)
|
|
139
|
+
return;
|
|
140
|
+
logger.debug(`Client ${this.clientId} is idle for ${this.settings.maxIdleTimeMs}ms, closing...`);
|
|
141
|
+
this.close();
|
|
142
|
+
}, this.settings.maxIdleTimeMs);
|
|
143
|
+
}
|
|
114
144
|
accept(sample) {
|
|
115
145
|
if (this.closed)
|
|
116
146
|
throw new Error(`Client ${this.clientId} is closed`);
|
|
147
|
+
this._createAutoClose();
|
|
117
148
|
const now = Date.now();
|
|
118
149
|
const elapsedInMs = now - this.updated;
|
|
119
150
|
const elapsedInSeconds = elapsedInMs / 1000;
|
|
@@ -248,11 +279,9 @@ class ObservedClient extends events_1.EventEmitter {
|
|
|
248
279
|
this.currentAvgRttInMs = 0 < numberOfRttMeasurements ? sumOfRtts / numberOfRttMeasurements : undefined;
|
|
249
280
|
this.calculatedScore.value = sample.score;
|
|
250
281
|
this.detectors.update();
|
|
282
|
+
this.lastSampleTimestamp = sample.timestamp;
|
|
251
283
|
// emit update
|
|
252
|
-
this.emit('update',
|
|
253
|
-
sample,
|
|
254
|
-
elapsedTimeInMs: now - this.updated,
|
|
255
|
-
});
|
|
284
|
+
this.emit('update', sample, now - this.updated);
|
|
256
285
|
this.updated = now;
|
|
257
286
|
// if result changed after update
|
|
258
287
|
if (this.calculatedScore.value) {
|
|
@@ -278,6 +307,7 @@ class ObservedClient extends events_1.EventEmitter {
|
|
|
278
307
|
logger.warn(`Client ${this.clientId} joinedAt timestamp was updated to ${event.timestamp}. the joined event will not be emitted.`);
|
|
279
308
|
}
|
|
280
309
|
}
|
|
310
|
+
logger.debug('Client %s joined at %o', this.clientId, event);
|
|
281
311
|
break;
|
|
282
312
|
}
|
|
283
313
|
case ClientEventTypes_1.ClientEventTypes.CLIENT_LEFT: {
|
|
@@ -290,6 +320,7 @@ class ObservedClient extends events_1.EventEmitter {
|
|
|
290
320
|
logger.warn(`Client ${this.clientId} leftAt timestamp was already set`);
|
|
291
321
|
}
|
|
292
322
|
}
|
|
323
|
+
logger.debug('Client %s left at %o', this.clientId, event);
|
|
293
324
|
break;
|
|
294
325
|
}
|
|
295
326
|
case ClientEventTypes_1.ClientEventTypes.PEER_CONNECTION_OPENED: {
|
|
@@ -303,7 +334,7 @@ class ObservedClient extends events_1.EventEmitter {
|
|
|
303
334
|
postBuffer.push(event);
|
|
304
335
|
}
|
|
305
336
|
else {
|
|
306
|
-
logger.warn('Received PEER_CONNECTION_OPENED event without a corresponding observedPeerConnection', event);
|
|
337
|
+
logger.warn('Received PEER_CONNECTION_OPENED event without a corresponding observedPeerConnection: %o', event);
|
|
307
338
|
}
|
|
308
339
|
}
|
|
309
340
|
break;
|
|
@@ -319,7 +350,7 @@ class ObservedClient extends events_1.EventEmitter {
|
|
|
319
350
|
postBuffer.push(event);
|
|
320
351
|
}
|
|
321
352
|
else {
|
|
322
|
-
logger.warn('Received PEER_CONNECTION_CLOSED event without a corresponding observedPeerConnection', event);
|
|
353
|
+
logger.warn('Received PEER_CONNECTION_CLOSED event without a corresponding observedPeerConnection: %o', event);
|
|
323
354
|
}
|
|
324
355
|
}
|
|
325
356
|
break;
|
|
@@ -336,7 +367,7 @@ class ObservedClient extends events_1.EventEmitter {
|
|
|
336
367
|
postBuffer.push(event);
|
|
337
368
|
}
|
|
338
369
|
else {
|
|
339
|
-
logger.warn('Received MEDIA_TRACK_ADDED event without a corresponding observedPeerConnection or observedTrack', event);
|
|
370
|
+
logger.warn('Received MEDIA_TRACK_ADDED event without a corresponding observedPeerConnection or observedTrack: %o', event);
|
|
340
371
|
}
|
|
341
372
|
}
|
|
342
373
|
break;
|
|
@@ -353,7 +384,7 @@ class ObservedClient extends events_1.EventEmitter {
|
|
|
353
384
|
postBuffer.push(event);
|
|
354
385
|
}
|
|
355
386
|
else {
|
|
356
|
-
logger.warn('Received MEDIA_TRACK_REMOVED event without a corresponding observedPeerConnection or observedTrack', event);
|
|
387
|
+
logger.warn('Received MEDIA_TRACK_REMOVED event without a corresponding observedPeerConnection or observedTrack: %o', event);
|
|
357
388
|
}
|
|
358
389
|
}
|
|
359
390
|
break;
|
|
@@ -370,7 +401,7 @@ class ObservedClient extends events_1.EventEmitter {
|
|
|
370
401
|
postBuffer.push(event);
|
|
371
402
|
}
|
|
372
403
|
else {
|
|
373
|
-
logger.warn('Received DATA_CHANNEL_OPENED event without a corresponding observedPeerConnection or observedDataChannel', event);
|
|
404
|
+
logger.warn('Received DATA_CHANNEL_OPENED event without a corresponding observedPeerConnection or observedDataChannel: %o', event);
|
|
374
405
|
}
|
|
375
406
|
}
|
|
376
407
|
break;
|
|
@@ -387,7 +418,114 @@ class ObservedClient extends events_1.EventEmitter {
|
|
|
387
418
|
postBuffer.push(event);
|
|
388
419
|
}
|
|
389
420
|
else {
|
|
390
|
-
logger.warn('Received DATA_CHANNEL_CLOSE event without a corresponding observedPeerConnection or observedDataChannel', event);
|
|
421
|
+
logger.warn('Received DATA_CHANNEL_CLOSE event without a corresponding observedPeerConnection or observedDataChannel: %o', event);
|
|
422
|
+
}
|
|
423
|
+
}
|
|
424
|
+
break;
|
|
425
|
+
}
|
|
426
|
+
case ClientEventTypes_1.ClientEventTypes.MEDIA_TRACK_MUTED: {
|
|
427
|
+
const payload = (0, utils_1.parseJsonAs)(event.payload);
|
|
428
|
+
if (payload?.peerConnectionId && typeof payload.peerConnectionId === 'string' && payload?.trackId && typeof payload.trackId === 'string') {
|
|
429
|
+
const observedPeerConnection = this.observedPeerConnections.get(payload.peerConnectionId);
|
|
430
|
+
const observedInboundTrack = observedPeerConnection?.observedInboundTracks.get(payload.trackId);
|
|
431
|
+
const observedOutboundTrack = observedPeerConnection?.observedOutboundTracks.get(payload.trackId);
|
|
432
|
+
if (observedPeerConnection) {
|
|
433
|
+
if (observedInboundTrack) {
|
|
434
|
+
observedInboundTrack.muted = true;
|
|
435
|
+
observedPeerConnection?.emit('muted-inbound-track', observedInboundTrack);
|
|
436
|
+
}
|
|
437
|
+
else if (observedOutboundTrack) {
|
|
438
|
+
observedOutboundTrack.muted = true;
|
|
439
|
+
observedPeerConnection?.emit('muted-outbound-track', observedOutboundTrack);
|
|
440
|
+
}
|
|
441
|
+
}
|
|
442
|
+
else if (postBuffer) {
|
|
443
|
+
postBuffer.push(event);
|
|
444
|
+
}
|
|
445
|
+
else {
|
|
446
|
+
logger.warn('Received MEDIA_TRACK_MUTED event without a corresponding observedPeerConnection or observedTrack: %o', event);
|
|
447
|
+
}
|
|
448
|
+
}
|
|
449
|
+
break;
|
|
450
|
+
}
|
|
451
|
+
case ClientEventTypes_1.ClientEventTypes.MEDIA_TRACK_UNMUTED: {
|
|
452
|
+
const payload = (0, utils_1.parseJsonAs)(event.payload);
|
|
453
|
+
if (payload?.peerConnectionId && typeof payload.peerConnectionId === 'string' && payload?.trackId && typeof payload.trackId === 'string') {
|
|
454
|
+
const observedPeerConnection = this.observedPeerConnections.get(payload.peerConnectionId);
|
|
455
|
+
const observedInboundTrack = observedPeerConnection?.observedInboundTracks.get(payload.trackId);
|
|
456
|
+
const observedOutboundTrack = observedPeerConnection?.observedOutboundTracks.get(payload.trackId);
|
|
457
|
+
if (observedPeerConnection) {
|
|
458
|
+
if (observedInboundTrack) {
|
|
459
|
+
observedInboundTrack.muted = false;
|
|
460
|
+
observedPeerConnection?.emit('unmuted-inbound-track', observedInboundTrack);
|
|
461
|
+
}
|
|
462
|
+
else if (observedOutboundTrack) {
|
|
463
|
+
observedOutboundTrack.muted = false;
|
|
464
|
+
observedPeerConnection?.emit('unmuted-outbound-track', observedOutboundTrack);
|
|
465
|
+
}
|
|
466
|
+
}
|
|
467
|
+
else if (postBuffer) {
|
|
468
|
+
postBuffer.push(event);
|
|
469
|
+
}
|
|
470
|
+
else {
|
|
471
|
+
logger.warn('Received MEDIA_TRACK_UNMUTED event without a corresponding observedPeerConnection or observedTrack: %o', event);
|
|
472
|
+
}
|
|
473
|
+
}
|
|
474
|
+
break;
|
|
475
|
+
}
|
|
476
|
+
case ClientEventTypes_1.ClientEventTypes.ICE_CONNECTION_STATE_CHANGED: {
|
|
477
|
+
const payload = (0, utils_1.parseJsonAs)(event.payload);
|
|
478
|
+
if (payload?.peerConnectionId && typeof payload.peerConnectionId === 'string' && payload?.iceConnectionState && typeof payload.iceConnectionState === 'string') {
|
|
479
|
+
const observedPeerConnection = this.observedPeerConnections.get(payload.peerConnectionId);
|
|
480
|
+
if (observedPeerConnection) {
|
|
481
|
+
observedPeerConnection.iceConnectionState = payload.iceConnectionState;
|
|
482
|
+
observedPeerConnection.emit('iceconnectionstatechange', {
|
|
483
|
+
state: payload.iceConnectionState,
|
|
484
|
+
});
|
|
485
|
+
}
|
|
486
|
+
else if (postBuffer) {
|
|
487
|
+
postBuffer.push(event);
|
|
488
|
+
}
|
|
489
|
+
else {
|
|
490
|
+
logger.warn('Received ICE_CONNECTION_STATE_CHANGED event without a corresponding observedPeerConnection: %o', event);
|
|
491
|
+
}
|
|
492
|
+
}
|
|
493
|
+
break;
|
|
494
|
+
}
|
|
495
|
+
case ClientEventTypes_1.ClientEventTypes.ICE_GATHERING_STATE_CHANGED: {
|
|
496
|
+
const payload = (0, utils_1.parseJsonAs)(event.payload);
|
|
497
|
+
if (payload?.peerConnectionId && typeof payload.peerConnectionId === 'string' && payload?.iceGatheringState && typeof payload.iceGatheringState === 'string') {
|
|
498
|
+
const observedPeerConnection = this.observedPeerConnections.get(payload.peerConnectionId);
|
|
499
|
+
if (observedPeerConnection) {
|
|
500
|
+
observedPeerConnection.iceGatheringState = payload.iceGatheringState;
|
|
501
|
+
observedPeerConnection.emit('icegatheringstatechange', {
|
|
502
|
+
state: payload.iceGatheringState,
|
|
503
|
+
});
|
|
504
|
+
}
|
|
505
|
+
else if (postBuffer) {
|
|
506
|
+
postBuffer.push(event);
|
|
507
|
+
}
|
|
508
|
+
else {
|
|
509
|
+
logger.warn('Received ICE_GATHERING_STATE_CHANGED event without a corresponding observedPeerConnection: %o', event);
|
|
510
|
+
}
|
|
511
|
+
}
|
|
512
|
+
break;
|
|
513
|
+
}
|
|
514
|
+
case ClientEventTypes_1.ClientEventTypes.PEER_CONNECTION_STATE_CHANGED: {
|
|
515
|
+
const payload = (0, utils_1.parseJsonAs)(event.payload);
|
|
516
|
+
if (payload?.peerConnectionId && typeof payload.peerConnectionId === 'string' && payload?.peerConnectionState && typeof payload.peerConnectionState === 'string') {
|
|
517
|
+
const observedPeerConnection = this.observedPeerConnections.get(payload.peerConnectionId);
|
|
518
|
+
if (observedPeerConnection) {
|
|
519
|
+
observedPeerConnection.connectionState = payload.peerConnectionState;
|
|
520
|
+
observedPeerConnection.emit('connectionstatechange', {
|
|
521
|
+
state: payload.peerConnectionState,
|
|
522
|
+
});
|
|
523
|
+
}
|
|
524
|
+
else if (postBuffer) {
|
|
525
|
+
postBuffer.push(event);
|
|
526
|
+
}
|
|
527
|
+
else {
|
|
528
|
+
logger.warn('Received PEER_CONNECTION_STATE_CHANGED event without a corresponding observedPeerConnection: %o', event);
|
|
391
529
|
}
|
|
392
530
|
}
|
|
393
531
|
break;
|
|
@@ -450,6 +588,34 @@ class ObservedClient extends events_1.EventEmitter {
|
|
|
450
588
|
this.operationSystem = (0, utils_1.parseJsonAs)(metadata.payload);
|
|
451
589
|
break;
|
|
452
590
|
}
|
|
591
|
+
case 'USER_AGENT_DATA': {
|
|
592
|
+
try {
|
|
593
|
+
const userAgentData = (0, utils_1.parseJsonAs)(metadata.payload);
|
|
594
|
+
if (userAgentData) {
|
|
595
|
+
if (this.operationSystem === undefined) {
|
|
596
|
+
this.operationSystem = {
|
|
597
|
+
name: userAgentData.os.name.toLowerCase(),
|
|
598
|
+
version: userAgentData.os.version,
|
|
599
|
+
};
|
|
600
|
+
}
|
|
601
|
+
if (this.engine === undefined) {
|
|
602
|
+
this.engine = {
|
|
603
|
+
name: userAgentData.engine.name.toLowerCase(),
|
|
604
|
+
version: userAgentData.engine.version,
|
|
605
|
+
};
|
|
606
|
+
}
|
|
607
|
+
if (this.browser === undefined) {
|
|
608
|
+
this.browser = {
|
|
609
|
+
name: userAgentData.browser.name.toLowerCase(),
|
|
610
|
+
version: userAgentData.browser.version,
|
|
611
|
+
};
|
|
612
|
+
}
|
|
613
|
+
}
|
|
614
|
+
}
|
|
615
|
+
catch (error) {
|
|
616
|
+
logger.warn('Failed to parse USER_AGENT_DATA metadata: %o', error);
|
|
617
|
+
}
|
|
618
|
+
}
|
|
453
619
|
}
|
|
454
620
|
this.call.observer.emit('client-metadata', this, metadata);
|
|
455
621
|
}
|