@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.
- package/README.md +535 -1
- package/lib/ObservedCall.d.ts +45 -7
- package/lib/ObservedCall.d.ts.map +1 -1
- package/lib/ObservedCall.js +156 -14
- package/lib/ObservedCallEventMonitor.d.ts +104 -0
- package/lib/ObservedCallEventMonitor.d.ts.map +1 -0
- package/lib/ObservedCallEventMonitor.js +314 -0
- package/lib/ObservedCallSummary.d.ts +18 -0
- package/lib/ObservedCallSummary.d.ts.map +1 -0
- package/lib/ObservedClient.d.ts +78 -19
- package/lib/ObservedClient.d.ts.map +1 -1
- package/lib/ObservedClient.js +537 -80
- package/lib/ObservedClientEventMonitor.d.ts +91 -0
- package/lib/ObservedClientEventMonitor.d.ts.map +1 -0
- package/lib/ObservedClientEventMonitor.js +254 -0
- package/lib/ObservedClientSummary.d.ts +23 -0
- package/lib/ObservedClientSummary.d.ts.map +1 -0
- package/lib/ObservedClientSummary.js +2 -0
- package/lib/ObservedTURN.d.ts +31 -0
- package/lib/ObservedTURN.d.ts.map +1 -0
- package/lib/ObservedTURN.js +59 -0
- package/lib/ObservedTurnServer.d.ts +25 -0
- package/lib/ObservedTurnServer.d.ts.map +1 -0
- package/lib/ObservedTurnServer.js +59 -0
- package/lib/Observer.d.ts +42 -22
- package/lib/Observer.d.ts.map +1 -1
- package/lib/Observer.js +115 -40
- package/lib/ObserverEventMonitor.d.ts +138 -0
- package/lib/ObserverEventMonitor.d.ts.map +1 -0
- package/lib/ObserverEventMonitor.js +433 -0
- package/lib/ObserverSummary.d.ts +13 -0
- package/lib/ObserverSummary.d.ts.map +1 -0
- package/lib/ObserverSummary.js +2 -0
- package/lib/common/utils.d.ts +2 -1
- package/lib/common/utils.d.ts.map +1 -1
- package/lib/common/utils.js +11 -3
- package/lib/index.d.ts +22 -16
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +25 -17
- 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 +228 -0
- package/lib/schema/ClientEventTypes.d.ts.map +1 -0
- package/lib/schema/ClientEventTypes.js +41 -0
- package/lib/schema/{metaTypes.d.ts → ClientMetaTypes.d.ts} +2 -2
- package/lib/schema/ClientMetaTypes.d.ts.map +1 -0
- package/lib/schema/ClientMetaTypes.js +16 -0
- package/lib/schema/ClientSample.d.ts +1 -1
- package/lib/schema/ClientSample.d.ts.map +1 -1
- package/lib/updaters/CallUpdater.d.ts.map +1 -0
- package/lib/updaters/CallUpdater.js +2 -0
- package/lib/updaters/ObserverUpdater.d.ts +5 -0
- package/lib/updaters/ObserverUpdater.d.ts.map +1 -0
- package/lib/updaters/ObserverUpdater.js +2 -0
- package/lib/updaters/OnAllCallObserverUpdater.d.ts +15 -0
- package/lib/updaters/OnAllCallObserverUpdater.d.ts.map +1 -0
- package/lib/updaters/OnAllCallObserverUpdater.js +50 -0
- package/lib/updaters/OnAllClientCallUpdater.d.ts +15 -0
- package/lib/updaters/OnAllClientCallUpdater.d.ts.map +1 -0
- package/lib/updaters/OnAllClientCallUpdater.js +53 -0
- package/lib/updaters/OnAnyCallObserverUpdater.d.ts +12 -0
- package/lib/updaters/OnAnyCallObserverUpdater.d.ts.map +1 -0
- package/lib/updaters/OnAnyCallObserverUpdater.js +37 -0
- package/lib/updaters/OnAnyClientCallUpdater.d.ts +12 -0
- package/lib/updaters/OnAnyClientCallUpdater.d.ts.map +1 -0
- package/lib/updaters/OnAnyClientCallUpdater.js +36 -0
- package/lib/updaters/OnIntervalUpdater.d.ts +10 -0
- package/lib/updaters/OnIntervalUpdater.d.ts.map +1 -0
- package/lib/updaters/OnIntervalUpdater.js +17 -0
- package/lib/updaters/Updater.d.ts +6 -0
- package/lib/updaters/Updater.d.ts.map +1 -0
- package/lib/updaters/Updater.js +2 -0
- package/lib/utils/MediasoupRemoteTrackResolver.d.ts +25 -0
- package/lib/utils/MediasoupRemoteTrackResolver.d.ts.map +1 -0
- package/lib/utils/MediasoupRemoteTrackResolver.js +110 -0
- 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} +7 -1
- package/lib/webrtc/ObservedDataChannel.d.ts.map +1 -0
- package/lib/{ObservedDataChannel.js → webrtc/ObservedDataChannel.js} +30 -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} +7 -2
- package/lib/webrtc/ObservedIceCandidatePair.d.ts.map +1 -0
- package/lib/{ObservedIceCandidatePair.js → webrtc/ObservedIceCandidatePair.js} +45 -1
- package/lib/{ObservedIceTransport.d.ts → webrtc/ObservedIceTransport.d.ts} +5 -1
- package/lib/webrtc/ObservedIceTransport.d.ts.map +1 -0
- package/lib/{ObservedIceTransport.js → webrtc/ObservedIceTransport.js} +28 -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} +7 -4
- package/lib/webrtc/ObservedInboundTrack.d.ts.map +1 -0
- package/lib/{ObservedInboundTrack.js → webrtc/ObservedInboundTrack.js} +4 -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} +7 -4
- package/lib/webrtc/ObservedOutboundTrack.d.ts.map +1 -0
- package/lib/{ObservedOutboundTrack.js → webrtc/ObservedOutboundTrack.js} +4 -1
- package/lib/{ObservedPeerConnection.d.ts → webrtc/ObservedPeerConnection.d.ts} +39 -5
- package/lib/webrtc/ObservedPeerConnection.d.ts.map +1 -0
- package/lib/{ObservedPeerConnection.js → webrtc/ObservedPeerConnection.js} +185 -30
- 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 +233 -17
- package/src/ObservedCallEventMonitor.ts +392 -0
- package/src/ObservedCallSummary.ts +22 -0
- package/src/ObservedClient.ts +644 -92
- package/src/ObservedClientEventMonitor.ts +309 -0
- package/src/ObservedClientSummary.ts +24 -0
- package/src/ObservedTURN.ts +87 -0
- package/src/ObservedTurnServer.ts +72 -0
- package/src/Observer.ts +168 -64
- package/src/ObserverEventMonitor.ts +551 -0
- package/src/ObserverSummary.ts +15 -0
- package/src/common/utils.ts +12 -2
- package/src/index.ts +22 -17
- package/src/mediasoup/ObservedMediasoupRouter.ts +12 -0
- package/src/schema/ClientEventTypes.ts +280 -0
- package/src/schema/{metaTypes.ts → ClientMetaTypes.ts} +1 -1
- package/src/schema/ClientSample.ts +1 -1
- package/src/updaters/ObserverUpdater.ts +5 -0
- package/src/updaters/OnAllCallObserverUpdater.ts +59 -0
- package/src/updaters/OnAllClientCallUpdater.ts +61 -0
- package/src/updaters/OnAnyCallObserverUpdater.ts +41 -0
- package/src/updaters/OnAnyClientCallUpdater.ts +39 -0
- package/src/updaters/OnIntervalUpdater.ts +19 -0
- package/src/updaters/Updater.ts +5 -0
- package/src/utils/MediasoupRemoteTrackResolver.ts +155 -0
- 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} +33 -1
- package/src/{ObservedIceCandidate.ts → webrtc/ObservedIceCandidate.ts} +1 -1
- package/src/{ObservedIceCandidatePair.ts → webrtc/ObservedIceCandidatePair.ts} +45 -3
- package/src/{ObservedIceTransport.ts → webrtc/ObservedIceTransport.ts} +30 -1
- package/src/{ObservedInboundRtp.ts → webrtc/ObservedInboundRtp.ts} +2 -2
- package/src/{ObservedInboundTrack.ts → webrtc/ObservedInboundTrack.ts} +9 -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} +9 -4
- package/src/{ObservedPeerConnection.ts → webrtc/ObservedPeerConnection.ts} +240 -51
- 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/tsconfig.json +1 -1
- 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/schema/eventTypes.d.ts +0 -33
- package/lib/schema/eventTypes.d.ts.map +0 -1
- package/lib/schema/eventTypes.js +0 -38
- package/lib/schema/metaTypes.d.ts.map +0 -1
- package/lib/schema/metaTypes.js +0 -16
- package/lib/utils/CallUpdater.d.ts.map +0 -1
- package/lib/utils/OnAllClientCallUpdater.d.ts +0 -16
- package/lib/utils/OnAllClientCallUpdater.d.ts.map +0 -1
- package/lib/utils/OnAllClientCallUpdater.js +0 -58
- package/lib/utils/onAnyClientCallUpdater.d.ts +0 -14
- package/lib/utils/onAnyClientCallUpdater.d.ts.map +0 -1
- package/lib/utils/onAnyClientCallUpdater.js +0 -51
- package/src/schema/eventTypes.ts +0 -36
- package/src/utils/OnAllClientCallUpdater.ts +0 -68
- package/src/utils/onAnyClientCallUpdater.ts +0 -59
- /package/lib/{utils/CallUpdater.js → ObservedCallSummary.js} +0 -0
- /package/lib/{utils → updaters}/CallUpdater.d.ts +0 -0
- /package/lib/{ObservedCertificate.js → webrtc/ObservedCertificate.js} +0 -0
- /package/lib/{ObservedCodec.js → webrtc/ObservedCodec.js} +0 -0
- /package/lib/{ObservedIceCandidate.js → webrtc/ObservedIceCandidate.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/{utils → updaters}/CallUpdater.ts +0 -0
package/lib/ObservedClient.js
CHANGED
|
@@ -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
|
|
8
|
-
const
|
|
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
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
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.
|
|
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
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
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
|
|
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
|
|
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.
|
|
139
|
-
call: this.call,
|
|
140
|
-
client: this,
|
|
141
|
-
data: event,
|
|
142
|
-
});
|
|
533
|
+
this.emit('clientEvent', event);
|
|
143
534
|
}
|
|
144
|
-
|
|
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
|
|
574
|
+
case ClientMetaTypes_1.ClientMetaTypes.BROWSER: {
|
|
147
575
|
this.browser = (0, utils_1.parseJsonAs)(metadata.payload);
|
|
148
576
|
break;
|
|
149
577
|
}
|
|
150
|
-
case
|
|
578
|
+
case ClientMetaTypes_1.ClientMetaTypes.ENGINE: {
|
|
151
579
|
this.engine = (0, utils_1.parseJsonAs)(metadata.payload);
|
|
152
580
|
break;
|
|
153
581
|
}
|
|
154
|
-
case
|
|
582
|
+
case ClientMetaTypes_1.ClientMetaTypes.PLATFORM: {
|
|
155
583
|
this.platform = (0, utils_1.parseJsonAs)(metadata.payload);
|
|
156
584
|
break;
|
|
157
585
|
}
|
|
158
|
-
case
|
|
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.
|
|
164
|
-
call: this.call,
|
|
165
|
-
client: this,
|
|
166
|
-
data: metadata,
|
|
167
|
-
});
|
|
591
|
+
this.call.observer.emit('client-metadata', this, metadata);
|
|
168
592
|
}
|
|
169
|
-
|
|
170
|
-
this.
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
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
|
-
|
|
177
|
-
this.call.observer.
|
|
178
|
-
|
|
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;
|