@observertc/observer-js 1.0.1-c3edea3.0 → 1.0.1-cda37f7.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/lib/ObservedCall.d.ts +43 -7
- package/lib/ObservedCall.d.ts.map +1 -1
- package/lib/ObservedCall.js +129 -13
- 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 +70 -11
- package/lib/ObservedClient.d.ts.map +1 -1
- package/lib/ObservedClient.js +392 -72
- package/lib/ObservedClientEventMonitor.d.ts +89 -0
- package/lib/ObservedClientEventMonitor.d.ts.map +1 -0
- package/lib/ObservedClientEventMonitor.js +247 -0
- package/lib/ObservedClientSummary.d.ts +23 -0
- package/lib/ObservedClientSummary.d.ts.map +1 -0
- package/lib/ObservedClientSummary.js +2 -0
- package/lib/ObservedDataChannel.d.ts +6 -0
- package/lib/ObservedDataChannel.d.ts.map +1 -1
- package/lib/ObservedDataChannel.js +30 -0
- package/lib/ObservedIceCandidatePair.d.ts +6 -1
- package/lib/ObservedIceCandidatePair.d.ts.map +1 -1
- package/lib/ObservedIceCandidatePair.js +45 -1
- package/lib/ObservedIceTransport.d.ts +4 -0
- package/lib/ObservedIceTransport.d.ts.map +1 -1
- package/lib/ObservedIceTransport.js +28 -0
- package/lib/ObservedInboundTrack.d.ts +2 -0
- package/lib/ObservedInboundTrack.d.ts.map +1 -1
- package/lib/ObservedInboundTrack.js +2 -0
- package/lib/ObservedOutboundTrack.d.ts +2 -0
- package/lib/ObservedOutboundTrack.d.ts.map +1 -1
- package/lib/ObservedOutboundTrack.js +2 -0
- package/lib/ObservedPeerConnection.d.ts +29 -2
- package/lib/ObservedPeerConnection.d.ts.map +1 -1
- package/lib/ObservedPeerConnection.js +181 -29
- package/lib/ObservedTURN.d.ts +31 -0
- package/lib/ObservedTURN.d.ts.map +1 -0
- package/lib/ObservedTURN.js +58 -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 +43 -22
- package/lib/Observer.d.ts.map +1 -1
- package/lib/Observer.js +126 -40
- package/lib/ObserverEventMonitor.d.ts +130 -0
- package/lib/ObserverEventMonitor.d.ts.map +1 -0
- package/lib/ObserverEventMonitor.js +404 -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 +6 -0
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +9 -1
- package/lib/schema/ClientEventTypes.d.ts +160 -0
- package/lib/schema/ClientEventTypes.d.ts.map +1 -0
- package/lib/schema/ClientEventTypes.js +38 -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/package.json +1 -1
- package/src/ObservedCall.ts +210 -16
- package/src/ObservedCallEventMonitor.ts +392 -0
- package/src/ObservedCallSummary.ts +22 -0
- package/src/ObservedClient.ts +490 -79
- package/src/ObservedClientEventMonitor.ts +301 -0
- package/src/ObservedClientSummary.ts +24 -0
- package/src/ObservedDataChannel.ts +32 -0
- package/src/ObservedIceCandidatePair.ts +44 -2
- package/src/ObservedIceTransport.ts +29 -0
- package/src/ObservedInboundTrack.ts +3 -0
- package/src/ObservedOutboundTrack.ts +3 -0
- package/src/ObservedPeerConnection.ts +210 -46
- package/src/ObservedTURN.ts +86 -0
- package/src/ObservedTurnServer.ts +72 -0
- package/src/Observer.ts +179 -64
- package/src/ObserverEventMonitor.ts +518 -0
- package/src/ObserverSummary.ts +15 -0
- package/src/common/utils.ts +12 -2
- package/src/index.ts +6 -0
- package/src/schema/ClientEventTypes.ts +176 -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/tsconfig.json +1 -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/src/{utils → updaters}/CallUpdater.ts +0 -0
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { ObservedIceCandidatePair } from './ObservedIceCandidatePair';
|
|
2
|
+
import { ObservedPeerConnection } from './ObservedPeerConnection';
|
|
3
|
+
import { ObservedTURN } from './ObservedTURN';
|
|
4
|
+
|
|
5
|
+
export class ObservedTurnServer {
|
|
6
|
+
public totalBytesSent = 0;
|
|
7
|
+
public totalBytesReceived = 0;
|
|
8
|
+
public totalPacketsSent = 0;
|
|
9
|
+
public totalPacketsReceived = 0;
|
|
10
|
+
|
|
11
|
+
public packetsSentPerSecond = 0;
|
|
12
|
+
public packetsReceivedPerSecond = 0;
|
|
13
|
+
public outboundBitrate = 0;
|
|
14
|
+
public inboundBitrate = 0;
|
|
15
|
+
|
|
16
|
+
public deltaBytesSent = 0;
|
|
17
|
+
public deltaBytesReceived = 0;
|
|
18
|
+
public deltaPacketsSent = 0;
|
|
19
|
+
public deltaPacketsReceived = 0;
|
|
20
|
+
|
|
21
|
+
public readonly observedPeerConnections = new Map<string, ObservedPeerConnection>();
|
|
22
|
+
|
|
23
|
+
public updated = Date.now();
|
|
24
|
+
|
|
25
|
+
public constructor(
|
|
26
|
+
public readonly url: string,
|
|
27
|
+
public readonly observedTURN: ObservedTURN,
|
|
28
|
+
) {
|
|
29
|
+
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
public updateTurnUsage(...selectedcandidatepairs: ObservedIceCandidatePair[]) {
|
|
33
|
+
for (const selectedcandidatepair of selectedcandidatepairs) {
|
|
34
|
+
this.deltaBytesReceived += selectedcandidatepair.deltaBytesReceived;
|
|
35
|
+
this.deltaBytesSent += selectedcandidatepair.deltaBytesSent;
|
|
36
|
+
this.deltaPacketsReceived += selectedcandidatepair.deltaPacketsReceived;
|
|
37
|
+
this.deltaPacketsSent += selectedcandidatepair.deltaPacketsSent;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
public update() {
|
|
42
|
+
const now = Date.now();
|
|
43
|
+
const deltaInS = (now - this.updated) / 1000;
|
|
44
|
+
|
|
45
|
+
this.packetsSentPerSecond = this.deltaPacketsSent / deltaInS;
|
|
46
|
+
this.packetsReceivedPerSecond = this.deltaPacketsReceived / deltaInS;
|
|
47
|
+
this.outboundBitrate = (this.deltaBytesReceived * 8) / deltaInS;
|
|
48
|
+
this.inboundBitrate = (this.deltaBytesSent * 8) / deltaInS;
|
|
49
|
+
|
|
50
|
+
this.totalBytesSent += this.deltaBytesSent;
|
|
51
|
+
this.totalBytesReceived += this.deltaBytesReceived;
|
|
52
|
+
this.totalPacketsSent += this.deltaPacketsSent;
|
|
53
|
+
this.totalPacketsReceived += this.deltaPacketsReceived;
|
|
54
|
+
|
|
55
|
+
this.observedTURN.totalBytesSent += this.deltaBytesSent;
|
|
56
|
+
this.observedTURN.totalBytesReceived += this.deltaBytesReceived;
|
|
57
|
+
this.observedTURN.totalPacketsSent += this.deltaPacketsSent;
|
|
58
|
+
this.observedTURN.totalPacketsReceived += this.deltaPacketsReceived;
|
|
59
|
+
|
|
60
|
+
this.observedTURN.inboundBitrate += this.inboundBitrate;
|
|
61
|
+
this.observedTURN.outboundBitrate += this.outboundBitrate;
|
|
62
|
+
this.observedTURN.packetsReceivedPerSecond += this.packetsReceivedPerSecond;
|
|
63
|
+
this.observedTURN.packetsSentPerSecond += this.packetsSentPerSecond;
|
|
64
|
+
|
|
65
|
+
this.deltaBytesSent = 0;
|
|
66
|
+
this.deltaBytesReceived = 0;
|
|
67
|
+
this.deltaPacketsSent = 0;
|
|
68
|
+
this.deltaPacketsReceived = 0;
|
|
69
|
+
|
|
70
|
+
this.updated = now;
|
|
71
|
+
}
|
|
72
|
+
}
|
package/src/Observer.ts
CHANGED
|
@@ -1,21 +1,36 @@
|
|
|
1
1
|
import { createLogger } from './common/logger';
|
|
2
|
-
import { Middleware, MiddlewareProcessor } from './common/Middleware';
|
|
3
2
|
import { ObservedCall, ObservedCallSettings } from './ObservedCall';
|
|
4
3
|
import { EventEmitter } from 'events';
|
|
5
|
-
import { ClientEvent, ClientMetaData, ClientIssue, ExtensionStat } from './schema/ClientSample';
|
|
4
|
+
import { ClientEvent, ClientMetaData, ClientIssue, ExtensionStat, ClientSample } from './schema/ClientSample';
|
|
6
5
|
import { ObservedClient } from './ObservedClient';
|
|
6
|
+
import { ObservedTURN } from './ObservedTURN';
|
|
7
|
+
import { Detectors } from './detectors/Detectors';
|
|
8
|
+
import { Updater } from './updaters/Updater';
|
|
9
|
+
import { OnIntervalUpdater } from './updaters/OnIntervalUpdater';
|
|
10
|
+
import { OnAllCallObserverUpdater } from './updaters/OnAllCallObserverUpdater';
|
|
11
|
+
import { OnAnyCallObserverUpdater } from './updaters/OnAnyCallObserverUpdater';
|
|
12
|
+
import { ObserverEventMonitor } from './ObserverEventMonitor';
|
|
13
|
+
import { MediasoupRemoteTrackResolver } from './utils/MediasoupRemoteTrackResolver';
|
|
7
14
|
|
|
8
15
|
const logger = createLogger('Observer');
|
|
9
16
|
|
|
10
17
|
export type ObserverEvents = {
|
|
18
|
+
'client-event': [ObservedClient, ClientEvent];
|
|
19
|
+
'call-updated': [ObservedCall],
|
|
20
|
+
'client-issue': [ObservedClient, ClientIssue],
|
|
21
|
+
'client-metadata': [ObservedClient, ClientMetaData],
|
|
22
|
+
'client-extension-stats': [ObservedClient, ExtensionStat],
|
|
11
23
|
'newcall': [ObservedCall],
|
|
24
|
+
'update': [],
|
|
12
25
|
'close': [],
|
|
13
26
|
}
|
|
14
27
|
|
|
15
|
-
export type
|
|
16
|
-
call
|
|
17
|
-
|
|
18
|
-
|
|
28
|
+
export type ObserverConfig<AppData extends Record<string, unknown> = Record<string, unknown>> = {
|
|
29
|
+
updatePolicy?: 'update-on-any-call-updated' | 'update-when-all-call-updated' | 'update-on-interval',
|
|
30
|
+
updateIntervalInMs?: number,
|
|
31
|
+
defaultCallUpdatePolicy?: ObservedCallSettings['updatePolicy'],
|
|
32
|
+
defaultCallUpdateIntervalInMs?: number,
|
|
33
|
+
appData?: AppData,
|
|
19
34
|
}
|
|
20
35
|
|
|
21
36
|
export declare interface Observer {
|
|
@@ -25,21 +40,80 @@ export declare interface Observer {
|
|
|
25
40
|
emit<U extends keyof ObserverEvents>(event: U, ...args: ObserverEvents[U]): boolean;
|
|
26
41
|
}
|
|
27
42
|
|
|
28
|
-
export class Observer extends EventEmitter {
|
|
29
|
-
public readonly
|
|
30
|
-
events: new MiddlewareProcessor<ProcessorInputContext<ClientEvent>>(),
|
|
31
|
-
metaData: new MiddlewareProcessor<ProcessorInputContext<ClientMetaData>>(),
|
|
32
|
-
issues: new MiddlewareProcessor<ProcessorInputContext<ClientIssue>>(),
|
|
33
|
-
extensionStats: new MiddlewareProcessor<ProcessorInputContext<ExtensionStat>>(),
|
|
34
|
-
};
|
|
43
|
+
export class Observer<AppData extends Record<string, unknown> = Record<string, unknown>> extends EventEmitter {
|
|
44
|
+
public readonly detectors: Detectors;
|
|
35
45
|
|
|
46
|
+
public readonly observedTURN = new ObservedTURN();
|
|
36
47
|
public readonly observedCalls = new Map<string, ObservedCall>();
|
|
48
|
+
public updater?: Updater;
|
|
49
|
+
|
|
37
50
|
public closed = false;
|
|
38
51
|
|
|
39
|
-
public
|
|
40
|
-
|
|
52
|
+
public totalAddedCall = 0;
|
|
53
|
+
public totalRemovedCall = 0;
|
|
54
|
+
public totalRttLt50Measurements = 0;
|
|
55
|
+
public totalRttLt150Measurements = 0;
|
|
56
|
+
public totalRttLt300Measurements = 0;
|
|
57
|
+
public totalRttGtOrEq300Measurements = 0;
|
|
58
|
+
public totalClientIssues = 0;
|
|
59
|
+
|
|
60
|
+
public numberOfClientsUsingTurn = 0;
|
|
61
|
+
public numberOfClients = 0;
|
|
62
|
+
public numberOfInboundRtpStreams = 0;
|
|
63
|
+
public numberOfOutboundRtpStreams = 0;
|
|
64
|
+
public numberOfDataChannels = 0;
|
|
65
|
+
public numberOfPeerConnections = 0;
|
|
66
|
+
|
|
67
|
+
public get numberOfCalls() {
|
|
68
|
+
return this.observedCalls.size;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
private _timer?: ReturnType<typeof setInterval>;
|
|
72
|
+
|
|
73
|
+
public constructor(public readonly config: ObserverConfig<AppData> = {
|
|
74
|
+
updatePolicy: 'update-when-all-call-updated',
|
|
75
|
+
updateIntervalInMs: undefined,
|
|
76
|
+
appData: {} as AppData,
|
|
77
|
+
}) {
|
|
41
78
|
super();
|
|
42
79
|
this.setMaxListeners(Infinity);
|
|
80
|
+
this.update = this.update.bind(this);
|
|
81
|
+
|
|
82
|
+
if (this.config.updateIntervalInMs) {
|
|
83
|
+
if (this.config.updatePolicy && this.config.updatePolicy !== 'update-on-interval') {
|
|
84
|
+
throw new Error('update policy must be update-on-interval if updateIntervalInMs is set in config');
|
|
85
|
+
}
|
|
86
|
+
this._timer = setInterval(this.update.bind(this), this.config.updateIntervalInMs);
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
if (this.config.updateIntervalInMs) {
|
|
90
|
+
if (this.config.updatePolicy !== 'update-on-interval') {
|
|
91
|
+
throw new Error('updatePolicy must be update-on-interval if updateIntervalInMs is set in config');
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
switch (this.config.updatePolicy) {
|
|
95
|
+
case 'update-on-any-call-updated':
|
|
96
|
+
this.updater = new OnAllCallObserverUpdater(this);
|
|
97
|
+
break;
|
|
98
|
+
case 'update-when-all-call-updated':
|
|
99
|
+
this.updater = new OnAnyCallObserverUpdater(this);
|
|
100
|
+
break;
|
|
101
|
+
case 'update-on-interval':
|
|
102
|
+
if (!this.config.updateIntervalInMs) {
|
|
103
|
+
throw new Error('updateIntervalInMs setting in config must be set if updatePolicy is update-on-interval');
|
|
104
|
+
}
|
|
105
|
+
this.updater = new OnIntervalUpdater(
|
|
106
|
+
this.config.updateIntervalInMs,
|
|
107
|
+
this.update.bind(this),
|
|
108
|
+
);
|
|
109
|
+
break;
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
this.detectors = new Detectors();
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
public get appData() {
|
|
116
|
+
return this.config.appData;
|
|
43
117
|
}
|
|
44
118
|
|
|
45
119
|
public getObservedCall<T extends Record<string, unknown> = Record<string, unknown>>(callId: string): ObservedCall<T> | undefined {
|
|
@@ -54,86 +128,127 @@ export class Observer extends EventEmitter {
|
|
|
54
128
|
if (this.closed) {
|
|
55
129
|
throw new Error('Attempted to create a call source on a closed observer');
|
|
56
130
|
}
|
|
57
|
-
|
|
131
|
+
if (!settings.updatePolicy) {
|
|
132
|
+
settings.updatePolicy = this.config.defaultCallUpdatePolicy;
|
|
133
|
+
settings.updateIntervalInMs = this.config.defaultCallUpdateIntervalInMs;
|
|
134
|
+
}
|
|
58
135
|
const observedCall = new ObservedCall(settings, this);
|
|
136
|
+
const onCallUpdated = () => this._onObservedCallUpdated(observedCall);
|
|
59
137
|
|
|
60
138
|
if (this.observedCalls.has(observedCall.callId)) throw new Error(`Observed Call with id ${observedCall.callId} already exists`);
|
|
61
139
|
|
|
140
|
+
if (settings.remoteTrackResolvePolicy === 'mediasoup-sfu') {
|
|
141
|
+
observedCall.remoteTrackResolver = new MediasoupRemoteTrackResolver(observedCall);
|
|
142
|
+
}
|
|
143
|
+
|
|
62
144
|
observedCall.once('close', () => {
|
|
63
145
|
this.observedCalls.delete(observedCall.callId);
|
|
146
|
+
observedCall.off('update', onCallUpdated);
|
|
147
|
+
++this.totalRemovedCall;
|
|
64
148
|
});
|
|
65
149
|
|
|
66
150
|
this.observedCalls.set(observedCall.callId, observedCall);
|
|
151
|
+
observedCall.on('update', onCallUpdated);
|
|
152
|
+
++this.totalAddedCall;
|
|
67
153
|
|
|
68
154
|
this.emit('newcall', observedCall);
|
|
69
155
|
|
|
70
156
|
return observedCall;
|
|
71
157
|
}
|
|
72
158
|
|
|
73
|
-
public
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
public removeClientEventMiddleware(...middlewares: Middleware<ProcessorInputContext<ClientEvent>>[]): Observer {
|
|
81
|
-
|
|
82
|
-
this.processors.events.removeMiddleware(...middlewares);
|
|
159
|
+
public close() {
|
|
160
|
+
if (this.closed) {
|
|
161
|
+
return logger.debug('Attempted to close twice');
|
|
162
|
+
}
|
|
163
|
+
this.closed = true;
|
|
164
|
+
clearInterval(this._timer);
|
|
165
|
+
this._timer = undefined;
|
|
83
166
|
|
|
84
|
-
|
|
167
|
+
this.observedCalls.forEach((call) => call.close());
|
|
168
|
+
|
|
169
|
+
this.emit('close');
|
|
85
170
|
}
|
|
86
171
|
|
|
87
|
-
public
|
|
172
|
+
public accept(sample: ClientSample) {
|
|
173
|
+
if (this.closed) return;
|
|
174
|
+
if (!sample.callId) return logger.warn('Received sample without callId. %o', sample);
|
|
175
|
+
if (!sample.clientId) return logger.warn('Received sample without clientId %o', sample);
|
|
88
176
|
|
|
89
|
-
this.
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
public removeClientMetaDataMiddleware(...middlewares: Middleware<ProcessorInputContext<ClientMetaData>>[]): Observer {
|
|
177
|
+
const call = this.getObservedCall(sample.callId) ?? this.createObservedCall({
|
|
178
|
+
callId: sample.callId,
|
|
179
|
+
updateIntervalInMs: this.config.defaultCallUpdateIntervalInMs,
|
|
180
|
+
updatePolicy: this.config.defaultCallUpdatePolicy,
|
|
181
|
+
});
|
|
95
182
|
|
|
96
|
-
|
|
183
|
+
const client = call.getObservedClient(sample.clientId) ?? call.createObservedClient({
|
|
184
|
+
clientId: sample.clientId,
|
|
185
|
+
});
|
|
97
186
|
|
|
98
|
-
|
|
187
|
+
client.accept(sample);
|
|
99
188
|
}
|
|
100
189
|
|
|
101
|
-
public
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
return this;
|
|
106
|
-
}
|
|
190
|
+
public update() {
|
|
191
|
+
if (this.closed) {
|
|
192
|
+
return;
|
|
193
|
+
}
|
|
107
194
|
|
|
108
|
-
|
|
195
|
+
this.numberOfInboundRtpStreams = 0;
|
|
196
|
+
this.numberOfOutboundRtpStreams = 0;
|
|
197
|
+
this.numberOfPeerConnections = 0;
|
|
198
|
+
this.numberOfDataChannels = 0;
|
|
199
|
+
this.numberOfClients = 0;
|
|
200
|
+
this.numberOfClientsUsingTurn = 0;
|
|
201
|
+
|
|
202
|
+
for (const call of this.observedCalls.values()) {
|
|
203
|
+
this.numberOfInboundRtpStreams += call.numberOfInboundRtpStreams;
|
|
204
|
+
this.numberOfOutboundRtpStreams += call.numberOfOutboundRtpStreams;
|
|
205
|
+
this.numberOfPeerConnections += call.numberOfPeerConnections;
|
|
206
|
+
this.numberOfDataChannels += call.numberOfDataChannels;
|
|
207
|
+
this.numberOfClients += call.numberOfClients;
|
|
208
|
+
this.numberOfClientsUsingTurn += call.clientsUsedTurn.size;
|
|
209
|
+
}
|
|
109
210
|
|
|
110
|
-
this.
|
|
211
|
+
this.observedTURN.update();
|
|
111
212
|
|
|
112
|
-
|
|
213
|
+
this.emit('update');
|
|
113
214
|
}
|
|
114
215
|
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
this.
|
|
118
|
-
|
|
119
|
-
|
|
216
|
+
private _onObservedCallUpdated(call: ObservedCall) {
|
|
217
|
+
this.totalRttLt50Measurements += call.deltaRttLt50Measurements;
|
|
218
|
+
this.totalRttLt150Measurements += call.deltaRttLt150Measurements;
|
|
219
|
+
this.totalRttLt300Measurements += call.deltaRttLt300Measurements;
|
|
220
|
+
this.totalRttGtOrEq300Measurements += call.deltaRttGtOrEq300Measurements;
|
|
221
|
+
this.totalClientIssues += call.deltaNumberOfIssues;
|
|
120
222
|
}
|
|
121
223
|
|
|
122
|
-
public
|
|
123
|
-
|
|
124
|
-
this.processors.extensionStats.removeMiddleware(...middlewares);
|
|
125
|
-
|
|
126
|
-
return this;
|
|
224
|
+
public createEventMonitor<CTX = unknown>(ctx?: CTX): ObserverEventMonitor<CTX> {
|
|
225
|
+
return new ObserverEventMonitor<CTX>(this, ctx ?? {} as CTX);
|
|
127
226
|
}
|
|
128
227
|
|
|
129
|
-
public
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
228
|
+
// public resetSummaryMetrics() {
|
|
229
|
+
// this.totalAddedCall = 0;
|
|
230
|
+
// this.totalRemovedCall = 0;
|
|
231
|
+
// this.totalRttLt50Measurements = 0;
|
|
232
|
+
// this.totalRttLt150Measurements = 0;
|
|
233
|
+
// this.totalRttLt300Measurements = 0;
|
|
234
|
+
// this.totalRttGtOrEq300Measurements = 0;
|
|
235
|
+
// this.totalClientIssues = 0;
|
|
236
|
+
// }
|
|
237
|
+
|
|
238
|
+
// public createSummary(): ObserverSummary {
|
|
239
|
+
// return {
|
|
240
|
+
// totalAddedCall: this.totalAddedCall,
|
|
241
|
+
// totalRemovedCall: this.totalRemovedCall,
|
|
242
|
+
// totalRttLt50Measurements: this.totalRttLt50Measurements,
|
|
243
|
+
// totalRttLt150Measurements: this.totalRttLt150Measurements,
|
|
244
|
+
// totalRttLt300Measurements: this.totalRttLt300Measurements,
|
|
245
|
+
// totalRttGtOrEq300Measurements: this.totalRttGtOrEq300Measurements,
|
|
246
|
+
|
|
247
|
+
// totalClientIssues: this.totalClientIssues,
|
|
248
|
+
// currentActiveCalls: this.observedCalls.size,
|
|
249
|
+
// currentNumberOfClients: this.numberOfClients,
|
|
250
|
+
// currentNumberOfClientsUsingTURN: this.numberOfClientsUsedTurn,
|
|
251
|
+
// };
|
|
252
|
+
// }
|
|
134
253
|
|
|
135
|
-
this.observedCalls.forEach((call) => call.close());
|
|
136
|
-
|
|
137
|
-
this.emit('close');
|
|
138
|
-
}
|
|
139
254
|
}
|