@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/src/ObservedCall.ts
CHANGED
|
@@ -6,15 +6,22 @@ import { CalculatedScore } from './scores/CalculatedScore';
|
|
|
6
6
|
import { DefaultCallScoreCalculator } from './scores/DefaultCallScoreCalculator';
|
|
7
7
|
import { Detectors } from './detectors/Detectors';
|
|
8
8
|
import { RemoteTrackResolver } from './utils/RemoteTrackResolver';
|
|
9
|
-
import {
|
|
10
|
-
import {
|
|
11
|
-
import {
|
|
9
|
+
import { OnAllClientCallUpdater } from './updaters/OnAllClientCallUpdater';
|
|
10
|
+
import { Updater } from './updaters/Updater';
|
|
11
|
+
import { OnIntervalUpdater } from './updaters/OnIntervalUpdater';
|
|
12
|
+
import { OnAnyClientCallUpdater } from './updaters/OnAnyClientCallUpdater';
|
|
13
|
+
import { ObservedCallEventMonitor } from './ObservedCallEventMonitor';
|
|
14
|
+
import { createLogger } from './common/logger';
|
|
15
|
+
|
|
16
|
+
const logger = createLogger('ObservedCall');
|
|
12
17
|
|
|
13
18
|
export type ObservedCallSettings<AppData extends Record<string, unknown> = Record<string, unknown>> = {
|
|
14
19
|
callId: string;
|
|
15
20
|
appData?: AppData;
|
|
16
21
|
remoteTrackResolvePolicy?: 'p2p' | 'mediasoup-sfu',
|
|
17
|
-
|
|
22
|
+
updatePolicy?: 'update-on-any-client-updated' | 'update-when-all-client-updated' | 'update-on-interval',
|
|
23
|
+
updateIntervalInMs?: number,
|
|
24
|
+
maxIdleIfEmptyMs?: number,
|
|
18
25
|
};
|
|
19
26
|
|
|
20
27
|
export type ObservedCallEvents = {
|
|
@@ -34,20 +41,57 @@ export declare interface ObservedCall {
|
|
|
34
41
|
|
|
35
42
|
export class ObservedCall<AppData extends Record<string, unknown> = Record<string, unknown>> extends EventEmitter {
|
|
36
43
|
public readonly detectors: Detectors;
|
|
44
|
+
public updater?: Updater;
|
|
45
|
+
public scoreCalculator: ScoreCalculator;
|
|
37
46
|
public readonly callId: string;
|
|
38
47
|
public readonly observedClients = new Map<string, ObservedClient>();
|
|
48
|
+
public readonly clientsUsedTurn = new Set<string>();
|
|
39
49
|
public readonly calculatedScore: CalculatedScore = {
|
|
40
50
|
weight: 1,
|
|
41
51
|
value: undefined,
|
|
42
52
|
};
|
|
43
53
|
public remoteTrackResolver?: RemoteTrackResolver;
|
|
44
|
-
public callUpdater?: CallUpdater;
|
|
45
54
|
|
|
46
|
-
public
|
|
55
|
+
public totalAddedClients = 0;
|
|
56
|
+
public totalRemovedClients = 0;
|
|
57
|
+
|
|
58
|
+
public totalClientsReceivedAudioBytes = 0;
|
|
59
|
+
public totalClientsReceivedVideoBytes = 0;
|
|
60
|
+
public totalClientsReceivedDataChannelBytes = 0;
|
|
61
|
+
public totalClientsReceivedBytes = 0;
|
|
62
|
+
|
|
63
|
+
public totalClientsSentAudioBytes = 0;
|
|
64
|
+
public totalClientsSentDataChannelBytes = 0;
|
|
65
|
+
public totalClientsSentVideoBytes = 0;
|
|
66
|
+
public totalClientsSentBytes = 0;
|
|
67
|
+
|
|
68
|
+
public totalRttLt50Measurements = 0;
|
|
69
|
+
public totalRttLt150Measurements = 0;
|
|
70
|
+
public totalRttLt300Measurements = 0;
|
|
71
|
+
public totalRttGtOrEq300Measurements = 0;
|
|
72
|
+
|
|
73
|
+
public numberOfIssues = 0;
|
|
74
|
+
public numberOfPeerConnections = 0;
|
|
75
|
+
public numberOfInboundRtpStreams = 0;
|
|
76
|
+
public numberOfOutboundRtpStreams = 0;
|
|
77
|
+
public numberOfDataChannels = 0;
|
|
78
|
+
|
|
79
|
+
public maxNumberOfClients = 0;
|
|
80
|
+
public deltaNumberOfIssues = 0;
|
|
81
|
+
|
|
82
|
+
public deltaRttLt50Measurements = 0;
|
|
83
|
+
public deltaRttLt150Measurements = 0;
|
|
84
|
+
public deltaRttLt300Measurements = 0;
|
|
85
|
+
public deltaRttGtOrEq300Measurements = 0;
|
|
86
|
+
|
|
87
|
+
public appData: AppData;
|
|
47
88
|
public closed = false;
|
|
48
|
-
public
|
|
49
|
-
public
|
|
50
|
-
public
|
|
89
|
+
public startedAt?: number;
|
|
90
|
+
public endedAt?: number;
|
|
91
|
+
public closedAt?: number;
|
|
92
|
+
|
|
93
|
+
public maxIdleIfEmptyMs?: number;
|
|
94
|
+
private _autoCloseTimer?: ReturnType<typeof setTimeout>;
|
|
51
95
|
|
|
52
96
|
public constructor(
|
|
53
97
|
settings: ObservedCallSettings<AppData>,
|
|
@@ -57,16 +101,31 @@ export class ObservedCall<AppData extends Record<string, unknown> = Record<strin
|
|
|
57
101
|
this.setMaxListeners(Infinity);
|
|
58
102
|
|
|
59
103
|
this.callId = settings.callId;
|
|
60
|
-
this.appData = settings.appData;
|
|
104
|
+
this.appData = settings.appData ?? {} as AppData;
|
|
61
105
|
this.scoreCalculator = new DefaultCallScoreCalculator(this);
|
|
106
|
+
this.maxIdleIfEmptyMs = settings.maxIdleIfEmptyMs;
|
|
62
107
|
this.detectors = new Detectors();
|
|
63
108
|
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
109
|
+
if (settings.updateIntervalInMs) {
|
|
110
|
+
if (settings.updatePolicy !== 'update-on-interval') {
|
|
111
|
+
throw new Error('updatePolicy must be update-on-interval if updateIntervalInMs is set in config');
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
switch (settings.updatePolicy) {
|
|
115
|
+
case 'update-on-any-client-updated':
|
|
116
|
+
this.updater = new OnAnyClientCallUpdater(this);
|
|
117
|
+
break;
|
|
118
|
+
case 'update-when-all-client-updated':
|
|
119
|
+
this.updater = new OnAllClientCallUpdater(this);
|
|
67
120
|
break;
|
|
68
|
-
case '
|
|
69
|
-
|
|
121
|
+
case 'update-on-interval':
|
|
122
|
+
if (!settings.updateIntervalInMs) {
|
|
123
|
+
throw new Error('updateIntervalInMs setting in config must be set if updatePolicy is update-on-interval');
|
|
124
|
+
}
|
|
125
|
+
this.updater = new OnIntervalUpdater(
|
|
126
|
+
settings.updateIntervalInMs,
|
|
127
|
+
this.update.bind(this),
|
|
128
|
+
);
|
|
70
129
|
break;
|
|
71
130
|
}
|
|
72
131
|
|
|
@@ -76,16 +135,35 @@ export class ObservedCall<AppData extends Record<string, unknown> = Record<strin
|
|
|
76
135
|
}
|
|
77
136
|
}
|
|
78
137
|
|
|
138
|
+
public get numberOfClients() {
|
|
139
|
+
return this.observedClients.size;
|
|
140
|
+
}
|
|
141
|
+
|
|
79
142
|
public get score() {
|
|
80
143
|
return this.calculatedScore.value;
|
|
81
144
|
}
|
|
82
145
|
|
|
83
146
|
public close() {
|
|
84
147
|
if (this.closed) return;
|
|
148
|
+
this.update(); // last update before closing
|
|
85
149
|
this.closed = true;
|
|
86
150
|
|
|
87
|
-
|
|
151
|
+
this.updater?.close();
|
|
152
|
+
|
|
153
|
+
let minSampleTimestamps: number | undefined;
|
|
154
|
+
let maxSampleTimestamps: number | undefined;
|
|
155
|
+
|
|
156
|
+
for (const client of this.observedClients.values()) {
|
|
157
|
+
client.close();
|
|
158
|
+
|
|
159
|
+
if (client.joinedAt) minSampleTimestamps = Math.min(minSampleTimestamps ?? client.joinedAt, client.joinedAt);
|
|
160
|
+
if (client.leftAt) maxSampleTimestamps = Math.max(maxSampleTimestamps ?? client.leftAt, client.leftAt);
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
if (this.startedAt === undefined) this.startedAt = minSampleTimestamps;
|
|
164
|
+
if (this.endedAt === undefined) this.endedAt = maxSampleTimestamps;
|
|
88
165
|
|
|
166
|
+
this.closedAt = Date.now();
|
|
89
167
|
this.emit('close');
|
|
90
168
|
}
|
|
91
169
|
|
|
@@ -101,33 +179,171 @@ export class ObservedCall<AppData extends Record<string, unknown> = Record<strin
|
|
|
101
179
|
|
|
102
180
|
const result = new ObservedClient<ClientAppData>(settings, this);
|
|
103
181
|
const wasEmpty = this.observedClients.size === 0;
|
|
104
|
-
const onUpdate = () => this.
|
|
182
|
+
const onUpdate = () => this._onClientUpdate(result);
|
|
183
|
+
const joined = () => this._clientJoined(result);
|
|
184
|
+
const left = () => this._clientLeft(result);
|
|
105
185
|
|
|
106
186
|
result.once('close', () => {
|
|
107
187
|
result.off('update', onUpdate);
|
|
188
|
+
result.off('joined', joined);
|
|
189
|
+
result.off('left', left);
|
|
108
190
|
this.observedClients.delete(settings.clientId);
|
|
109
191
|
|
|
110
192
|
if (this.observedClients.size === 0) {
|
|
111
193
|
this.emit('empty');
|
|
194
|
+
|
|
195
|
+
this._createAutoClose();
|
|
112
196
|
}
|
|
197
|
+
++this.totalRemovedClients;
|
|
113
198
|
});
|
|
114
199
|
result.on('update', onUpdate);
|
|
200
|
+
result.on('joined', joined);
|
|
201
|
+
result.on('left', left);
|
|
202
|
+
++this.totalAddedClients;
|
|
115
203
|
|
|
116
204
|
this.observedClients.set(settings.clientId, result);
|
|
205
|
+
this.maxNumberOfClients = Math.max(this.maxNumberOfClients, this.observedClients.size);
|
|
117
206
|
|
|
118
207
|
this.emit('newclient', result);
|
|
119
208
|
|
|
120
209
|
if (wasEmpty) {
|
|
121
210
|
this.emit('not-empty');
|
|
211
|
+
|
|
212
|
+
clearTimeout(this._autoCloseTimer);
|
|
213
|
+
this._autoCloseTimer = undefined;
|
|
122
214
|
}
|
|
123
215
|
|
|
124
216
|
return result;
|
|
125
217
|
}
|
|
126
218
|
|
|
219
|
+
public createEventMonitor<CTX>(context: CTX): ObservedCallEventMonitor<CTX> {
|
|
220
|
+
return new ObservedCallEventMonitor(this, context);
|
|
221
|
+
}
|
|
222
|
+
|
|
127
223
|
public update() {
|
|
224
|
+
if (this.closed) return;
|
|
225
|
+
|
|
226
|
+
this.numberOfInboundRtpStreams = 0;
|
|
227
|
+
this.numberOfOutboundRtpStreams = 0;
|
|
228
|
+
this.numberOfPeerConnections = 0;
|
|
229
|
+
this.numberOfDataChannels = 0;
|
|
230
|
+
|
|
231
|
+
for (const client of this.observedClients.values()) {
|
|
232
|
+
this.numberOfInboundRtpStreams += client.numberOfInboundRtpStreams;
|
|
233
|
+
this.numberOfOutboundRtpStreams += client.numberOfOutboundRtpStreams;
|
|
234
|
+
this.numberOfPeerConnections += client.numberOfPeerConnections;
|
|
235
|
+
this.numberOfDataChannels += client.numberOfDataChannels;
|
|
236
|
+
}
|
|
237
|
+
|
|
128
238
|
this.detectors.update();
|
|
129
239
|
this.scoreCalculator.update();
|
|
130
240
|
|
|
131
241
|
this.emit('update');
|
|
242
|
+
|
|
243
|
+
this.deltaNumberOfIssues = 0;
|
|
244
|
+
this.deltaRttLt50Measurements = 0;
|
|
245
|
+
this.deltaRttLt150Measurements = 0;
|
|
246
|
+
this.deltaRttLt300Measurements = 0;
|
|
247
|
+
this.deltaRttGtOrEq300Measurements = 0;
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
private _onClientUpdate(client: ObservedClient) {
|
|
251
|
+
this.totalClientsReceivedAudioBytes += client.deltaReceivedAudioBytes;
|
|
252
|
+
this.totalClientsReceivedVideoBytes += client.deltaReceivedVideoBytes;
|
|
253
|
+
this.totalClientsReceivedDataChannelBytes += client.deltaDataChannelBytesReceived;
|
|
254
|
+
this.totalClientsReceivedBytes += client.deltaTransportReceivedBytes;
|
|
255
|
+
this.totalClientsSentAudioBytes += client.deltaSentAudioBytes;
|
|
256
|
+
this.totalClientsSentVideoBytes += client.deltaSentVideoBytes;
|
|
257
|
+
this.totalClientsSentDataChannelBytes += client.deltaDataChannelBytesSent;
|
|
258
|
+
this.totalClientsSentBytes += client.deltaTransportSentBytes;
|
|
259
|
+
|
|
260
|
+
this.deltaRttLt50Measurements += client.deltaRttLt50Measurements;
|
|
261
|
+
this.deltaRttLt150Measurements += client.deltaRttLt150Measurements;
|
|
262
|
+
this.deltaRttLt300Measurements += client.deltaRttLt300Measurements;
|
|
263
|
+
this.deltaRttGtOrEq300Measurements += client.deltaRttGtOrEq300Measurements;
|
|
264
|
+
|
|
265
|
+
this.totalRttLt50Measurements += client.deltaRttLt50Measurements;
|
|
266
|
+
this.totalRttLt150Measurements += client.deltaRttLt150Measurements;
|
|
267
|
+
this.totalRttLt300Measurements += client.deltaRttLt300Measurements;
|
|
268
|
+
this.totalRttGtOrEq300Measurements += client.deltaRttGtOrEq300Measurements;
|
|
269
|
+
|
|
270
|
+
this.deltaNumberOfIssues += client.deltaNumberOfIssues;
|
|
271
|
+
this.numberOfIssues += client.deltaNumberOfIssues;
|
|
272
|
+
|
|
273
|
+
if (client.usingTURN) {
|
|
274
|
+
this.clientsUsedTurn.add(client.clientId);
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
private _clientJoined(client: ObservedClient) {
|
|
279
|
+
if (!client.joinedAt) return;
|
|
280
|
+
|
|
281
|
+
this.startedAt = Math.min(this.startedAt ?? client.joinedAt, client.joinedAt);
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
private _clientLeft(client: ObservedClient) {
|
|
285
|
+
if (!client.leftAt) return;
|
|
286
|
+
|
|
287
|
+
this.endedAt = Math.max(this.endedAt ?? client.leftAt, client.leftAt);
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
private _createAutoClose() {
|
|
291
|
+
if (this.closed) return;
|
|
292
|
+
if (this.maxIdleIfEmptyMs === undefined || this.maxIdleIfEmptyMs < 1) return;
|
|
293
|
+
|
|
294
|
+
this._autoCloseTimer = setTimeout(() => {
|
|
295
|
+
if (this.closed) return;
|
|
296
|
+
if (this.observedClients.size > 0) return;
|
|
297
|
+
|
|
298
|
+
logger.debug(`Call ${this.callId} is empty for ${this.maxIdleIfEmptyMs}ms, closing...`);
|
|
299
|
+
this.close();
|
|
300
|
+
}, this.maxIdleIfEmptyMs);
|
|
132
301
|
}
|
|
302
|
+
|
|
303
|
+
// public resetSummaryMetrics() {
|
|
304
|
+
// this.totalAddedClients = 0;
|
|
305
|
+
// this.totalRemovedClients = 0;
|
|
306
|
+
|
|
307
|
+
// this.totalClientsReceivedAudioBytes = 0;
|
|
308
|
+
// this.totalClientsReceivedVideoBytes = 0;
|
|
309
|
+
// this.totalClientsReceivedBytes = 0;
|
|
310
|
+
|
|
311
|
+
// this.totalClientsSentAudioBytes = 0;
|
|
312
|
+
// this.totalClientsSentVideoBytes = 0;
|
|
313
|
+
// this.totalClientsSentBytes = 0;
|
|
314
|
+
|
|
315
|
+
// this.totalRttLt50Measurements = 0;
|
|
316
|
+
// this.totalRttLt150Measurements = 0;
|
|
317
|
+
// this.totalRttLt300Measurements = 0;
|
|
318
|
+
// this.totalRttGtOrEq300Measurements = 0;
|
|
319
|
+
|
|
320
|
+
// this.numberOfIssues = 0;
|
|
321
|
+
|
|
322
|
+
// this.clientsUsedTurn.clear();
|
|
323
|
+
|
|
324
|
+
// }
|
|
325
|
+
|
|
326
|
+
// public createSummary(): ObservedCallSummary {
|
|
327
|
+
// return {
|
|
328
|
+
// currentActiveClients: this.observedClients.size,
|
|
329
|
+
// totalAddedClients: this.totalAddedClients,
|
|
330
|
+
// totalRemovedClients: this.totalRemovedClients,
|
|
331
|
+
|
|
332
|
+
// totalClientsReceivedAudioBytes: this.totalClientsReceivedBytes,
|
|
333
|
+
// totalClientsReceivedVideoBytes: this.totalClientsReceivedVideoBytes,
|
|
334
|
+
// totalClientsReceivedBytes: this.totalClientsReceivedBytes,
|
|
335
|
+
|
|
336
|
+
// totalClientsSentAudioBytes: this.totalClientsSentAudioBytes,
|
|
337
|
+
// totalClientsSentVideoBytes: this.totalClientsSentVideoBytes,
|
|
338
|
+
// totalClientsSentBytes: this.totalClientsSentBytes,
|
|
339
|
+
|
|
340
|
+
// totalRttLt50Measurements: this.totalRttLt50Measurements,
|
|
341
|
+
// totalRttLt150Measurements: this.totalRttLt150Measurements,
|
|
342
|
+
// totalRttLt300Measurements: this.totalRttLt300Measurements,
|
|
343
|
+
// totalRttGtOrEq300Measurements: this.totalRttGtOrEq300Measurements,
|
|
344
|
+
|
|
345
|
+
// numberOfIssues: this.numberOfIssues,
|
|
346
|
+
// numberOfClientsUsedTurn: this.clientsUsedTurn.size,
|
|
347
|
+
// };
|
|
348
|
+
// }
|
|
133
349
|
}
|