@observertc/observer-js 1.0.1-c2558cc.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 +4 -2
- package/lib/ObservedCall.d.ts.map +1 -1
- package/lib/ObservedCall.js +37 -11
- package/lib/ObservedCallEventMonitor.d.ts +13 -13
- package/lib/ObservedCallEventMonitor.d.ts.map +1 -1
- package/lib/ObservedCallEventMonitor.js +1 -1
- package/lib/ObservedClient.d.ts +9 -9
- package/lib/ObservedClient.d.ts.map +1 -1
- package/lib/ObservedClient.js +104 -17
- package/lib/ObservedClientEventMonitor.d.ts +54 -52
- package/lib/ObservedClientEventMonitor.d.ts.map +1 -1
- package/lib/ObservedClientEventMonitor.js +7 -0
- package/lib/ObservedTURN.d.ts +1 -1
- package/lib/ObservedTURN.d.ts.map +1 -1
- package/lib/ObservedTURN.js +1 -0
- package/lib/ObservedTurnServer.d.ts +2 -2
- package/lib/ObservedTurnServer.d.ts.map +1 -1
- package/lib/Observer.d.ts +0 -1
- package/lib/Observer.d.ts.map +1 -1
- package/lib/Observer.js +9 -20
- package/lib/ObserverEventMonitor.d.ts +13 -13
- package/lib/ObserverEventMonitor.d.ts.map +1 -1
- package/lib/ObserverEventMonitor.js +1 -1
- package/lib/index.d.ts +17 -17
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +16 -16
- package/lib/mediasoup/ObservedMediasoupRouter.d.ts +7 -0
- package/lib/mediasoup/ObservedMediasoupRouter.d.ts.map +1 -0
- package/lib/mediasoup/ObservedMediasoupRouter.js +12 -0
- package/lib/schema/ClientEventTypes.d.ts +147 -79
- package/lib/schema/ClientEventTypes.d.ts.map +1 -1
- package/lib/schema/ClientEventTypes.js +5 -2
- package/lib/utils/MediasoupRemoteTrackResolver.d.ts +2 -2
- package/lib/utils/MediasoupRemoteTrackResolver.d.ts.map +1 -1
- package/lib/utils/RemoteTrackResolver.d.ts +2 -2
- package/lib/utils/RemoteTrackResolver.d.ts.map +1 -1
- package/lib/{ObservedCertificate.d.ts → webrtc/ObservedCertificate.d.ts} +1 -1
- package/lib/webrtc/ObservedCertificate.d.ts.map +1 -0
- package/lib/{ObservedCodec.d.ts → webrtc/ObservedCodec.d.ts} +1 -1
- package/lib/webrtc/ObservedCodec.d.ts.map +1 -0
- package/lib/{ObservedDataChannel.d.ts → webrtc/ObservedDataChannel.d.ts} +1 -1
- package/lib/webrtc/ObservedDataChannel.d.ts.map +1 -0
- package/lib/{ObservedIceCandidate.d.ts → webrtc/ObservedIceCandidate.d.ts} +1 -1
- package/lib/webrtc/ObservedIceCandidate.d.ts.map +1 -0
- package/lib/{ObservedIceCandidatePair.d.ts → webrtc/ObservedIceCandidatePair.d.ts} +1 -1
- package/lib/webrtc/ObservedIceCandidatePair.d.ts.map +1 -0
- package/lib/{ObservedIceTransport.d.ts → webrtc/ObservedIceTransport.d.ts} +1 -1
- package/lib/webrtc/ObservedIceTransport.d.ts.map +1 -0
- package/lib/{ObservedInboundRtp.d.ts → webrtc/ObservedInboundRtp.d.ts} +2 -2
- package/lib/webrtc/ObservedInboundRtp.d.ts.map +1 -0
- package/lib/{ObservedInboundTrack.d.ts → webrtc/ObservedInboundTrack.d.ts} +4 -4
- package/lib/webrtc/ObservedInboundTrack.d.ts.map +1 -0
- package/lib/{ObservedInboundTrack.js → webrtc/ObservedInboundTrack.js} +1 -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} +4 -4
- package/lib/webrtc/ObservedOutboundTrack.d.ts.map +1 -0
- package/lib/{ObservedOutboundTrack.js → webrtc/ObservedOutboundTrack.js} +1 -1
- package/lib/{ObservedPeerConnection.d.ts → webrtc/ObservedPeerConnection.d.ts} +7 -4
- package/lib/webrtc/ObservedPeerConnection.d.ts.map +1 -0
- package/lib/{ObservedPeerConnection.js → webrtc/ObservedPeerConnection.js} +5 -2
- 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 +39 -17
- package/src/ObservedCallEventMonitor.ts +14 -14
- package/src/ObservedClient.ts +116 -24
- package/src/ObservedClientEventMonitor.ts +59 -51
- package/src/ObservedTURN.ts +2 -1
- package/src/ObservedTurnServer.ts +2 -2
- package/src/Observer.ts +13 -24
- package/src/ObserverEventMonitor.ts +14 -14
- package/src/index.ts +17 -17
- package/src/mediasoup/ObservedMediasoupRouter.ts +12 -0
- package/src/schema/ClientEventTypes.ts +187 -83
- package/src/utils/MediasoupRemoteTrackResolver.ts +2 -2
- package/src/utils/RemoteTrackResolver.ts +2 -2
- package/src/{ObservedCertificate.ts → webrtc/ObservedCertificate.ts} +1 -1
- package/src/{ObservedCodec.ts → webrtc/ObservedCodec.ts} +1 -1
- package/src/{ObservedDataChannel.ts → webrtc/ObservedDataChannel.ts} +1 -1
- package/src/{ObservedIceCandidate.ts → webrtc/ObservedIceCandidate.ts} +1 -1
- package/src/{ObservedIceCandidatePair.ts → webrtc/ObservedIceCandidatePair.ts} +1 -1
- package/src/{ObservedIceTransport.ts → webrtc/ObservedIceTransport.ts} +1 -1
- package/src/{ObservedInboundRtp.ts → webrtc/ObservedInboundRtp.ts} +2 -2
- package/src/{ObservedInboundTrack.ts → webrtc/ObservedInboundTrack.ts} +4 -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} +4 -4
- package/src/{ObservedPeerConnection.ts → webrtc/ObservedPeerConnection.ts} +27 -7
- package/src/{ObservedPeerConnectionTransport.ts → webrtc/ObservedPeerConnectionTransport.ts} +1 -1
- package/src/{ObservedRemoteInboundRtp.ts → webrtc/ObservedRemoteInboundRtp.ts} +2 -2
- package/src/{ObservedRemoteOutboundRtp.ts → webrtc/ObservedRemoteOutboundRtp.ts} +2 -2
- package/lib/ObservedCertificate.d.ts.map +0 -1
- package/lib/ObservedCodec.d.ts.map +0 -1
- package/lib/ObservedDataChannel.d.ts.map +0 -1
- package/lib/ObservedIceCandidate.d.ts.map +0 -1
- package/lib/ObservedIceCandidatePair.d.ts.map +0 -1
- package/lib/ObservedIceTransport.d.ts.map +0 -1
- package/lib/ObservedInboundRtp.d.ts.map +0 -1
- package/lib/ObservedInboundTrack.d.ts.map +0 -1
- package/lib/ObservedMediaPlayout.d.ts.map +0 -1
- package/lib/ObservedMediaSource.d.ts.map +0 -1
- package/lib/ObservedOutboundRtp.d.ts.map +0 -1
- package/lib/ObservedOutboundTrack.d.ts.map +0 -1
- package/lib/ObservedPeerConnection.d.ts.map +0 -1
- package/lib/ObservedPeerConnectionTransport.d.ts.map +0 -1
- package/lib/ObservedRemoteInboundRtp.d.ts.map +0 -1
- package/lib/ObservedRemoteOutboundRtp.d.ts.map +0 -1
- /package/lib/{ObservedCertificate.js → webrtc/ObservedCertificate.js} +0 -0
- /package/lib/{ObservedCodec.js → webrtc/ObservedCodec.js} +0 -0
- /package/lib/{ObservedDataChannel.js → webrtc/ObservedDataChannel.js} +0 -0
- /package/lib/{ObservedIceCandidate.js → webrtc/ObservedIceCandidate.js} +0 -0
- /package/lib/{ObservedIceCandidatePair.js → webrtc/ObservedIceCandidatePair.js} +0 -0
- /package/lib/{ObservedIceTransport.js → webrtc/ObservedIceTransport.js} +0 -0
- /package/lib/{ObservedInboundRtp.js → webrtc/ObservedInboundRtp.js} +0 -0
- /package/lib/{ObservedMediaPlayout.js → webrtc/ObservedMediaPlayout.js} +0 -0
- /package/lib/{ObservedMediaSource.js → webrtc/ObservedMediaSource.js} +0 -0
- /package/lib/{ObservedOutboundRtp.js → webrtc/ObservedOutboundRtp.js} +0 -0
- /package/lib/{ObservedPeerConnectionTransport.js → webrtc/ObservedPeerConnectionTransport.js} +0 -0
- /package/lib/{ObservedRemoteInboundRtp.js → webrtc/ObservedRemoteInboundRtp.js} +0 -0
- /package/lib/{ObservedRemoteOutboundRtp.js → webrtc/ObservedRemoteOutboundRtp.js} +0 -0
package/lib/ObservedCall.js
CHANGED
|
@@ -9,6 +9,8 @@ const OnAllClientCallUpdater_1 = require("./updaters/OnAllClientCallUpdater");
|
|
|
9
9
|
const OnIntervalUpdater_1 = require("./updaters/OnIntervalUpdater");
|
|
10
10
|
const OnAnyClientCallUpdater_1 = require("./updaters/OnAnyClientCallUpdater");
|
|
11
11
|
const ObservedCallEventMonitor_1 = require("./ObservedCallEventMonitor");
|
|
12
|
+
const logger_1 = require("./common/logger");
|
|
13
|
+
const logger = (0, logger_1.createLogger)('ObservedCall');
|
|
12
14
|
class ObservedCall extends events_1.EventEmitter {
|
|
13
15
|
observer;
|
|
14
16
|
detectors;
|
|
@@ -52,8 +54,8 @@ class ObservedCall extends events_1.EventEmitter {
|
|
|
52
54
|
startedAt;
|
|
53
55
|
endedAt;
|
|
54
56
|
closedAt;
|
|
55
|
-
|
|
56
|
-
|
|
57
|
+
maxIdleIfEmptyMs;
|
|
58
|
+
_autoCloseTimer;
|
|
57
59
|
constructor(settings, observer) {
|
|
58
60
|
super();
|
|
59
61
|
this.observer = observer;
|
|
@@ -61,6 +63,7 @@ class ObservedCall extends events_1.EventEmitter {
|
|
|
61
63
|
this.callId = settings.callId;
|
|
62
64
|
this.appData = settings.appData ?? {};
|
|
63
65
|
this.scoreCalculator = new DefaultCallScoreCalculator_1.DefaultCallScoreCalculator(this);
|
|
66
|
+
this.maxIdleIfEmptyMs = settings.maxIdleIfEmptyMs;
|
|
64
67
|
this.detectors = new Detectors_1.Detectors();
|
|
65
68
|
if (settings.updateIntervalInMs) {
|
|
66
69
|
if (settings.updatePolicy !== 'update-on-interval') {
|
|
@@ -69,10 +72,10 @@ class ObservedCall extends events_1.EventEmitter {
|
|
|
69
72
|
}
|
|
70
73
|
switch (settings.updatePolicy) {
|
|
71
74
|
case 'update-on-any-client-updated':
|
|
72
|
-
this.updater = new
|
|
75
|
+
this.updater = new OnAnyClientCallUpdater_1.OnAnyClientCallUpdater(this);
|
|
73
76
|
break;
|
|
74
77
|
case 'update-when-all-client-updated':
|
|
75
|
-
this.updater = new
|
|
78
|
+
this.updater = new OnAllClientCallUpdater_1.OnAllClientCallUpdater(this);
|
|
76
79
|
break;
|
|
77
80
|
case 'update-on-interval':
|
|
78
81
|
if (!settings.updateIntervalInMs) {
|
|
@@ -85,12 +88,6 @@ class ObservedCall extends events_1.EventEmitter {
|
|
|
85
88
|
case 'mediasoup-sfu':
|
|
86
89
|
break;
|
|
87
90
|
}
|
|
88
|
-
this._callStartedEvent = {
|
|
89
|
-
emitted: false,
|
|
90
|
-
};
|
|
91
|
-
this._callEndedEvent = {
|
|
92
|
-
emitted: false,
|
|
93
|
-
};
|
|
94
91
|
}
|
|
95
92
|
get numberOfClients() {
|
|
96
93
|
return this.observedClients.size;
|
|
@@ -104,7 +101,19 @@ class ObservedCall extends events_1.EventEmitter {
|
|
|
104
101
|
this.update(); // last update before closing
|
|
105
102
|
this.closed = true;
|
|
106
103
|
this.updater?.close();
|
|
107
|
-
|
|
104
|
+
let minSampleTimestamps;
|
|
105
|
+
let maxSampleTimestamps;
|
|
106
|
+
for (const client of this.observedClients.values()) {
|
|
107
|
+
client.close();
|
|
108
|
+
if (client.joinedAt)
|
|
109
|
+
minSampleTimestamps = Math.min(minSampleTimestamps ?? client.joinedAt, client.joinedAt);
|
|
110
|
+
if (client.leftAt)
|
|
111
|
+
maxSampleTimestamps = Math.max(maxSampleTimestamps ?? client.leftAt, client.leftAt);
|
|
112
|
+
}
|
|
113
|
+
if (this.startedAt === undefined)
|
|
114
|
+
this.startedAt = minSampleTimestamps;
|
|
115
|
+
if (this.endedAt === undefined)
|
|
116
|
+
this.endedAt = maxSampleTimestamps;
|
|
108
117
|
this.closedAt = Date.now();
|
|
109
118
|
this.emit('close');
|
|
110
119
|
}
|
|
@@ -130,6 +139,7 @@ class ObservedCall extends events_1.EventEmitter {
|
|
|
130
139
|
this.observedClients.delete(settings.clientId);
|
|
131
140
|
if (this.observedClients.size === 0) {
|
|
132
141
|
this.emit('empty');
|
|
142
|
+
this._createAutoClose();
|
|
133
143
|
}
|
|
134
144
|
++this.totalRemovedClients;
|
|
135
145
|
});
|
|
@@ -142,6 +152,8 @@ class ObservedCall extends events_1.EventEmitter {
|
|
|
142
152
|
this.emit('newclient', result);
|
|
143
153
|
if (wasEmpty) {
|
|
144
154
|
this.emit('not-empty');
|
|
155
|
+
clearTimeout(this._autoCloseTimer);
|
|
156
|
+
this._autoCloseTimer = undefined;
|
|
145
157
|
}
|
|
146
158
|
return result;
|
|
147
159
|
}
|
|
@@ -203,5 +215,19 @@ class ObservedCall extends events_1.EventEmitter {
|
|
|
203
215
|
return;
|
|
204
216
|
this.endedAt = Math.max(this.endedAt ?? client.leftAt, client.leftAt);
|
|
205
217
|
}
|
|
218
|
+
_createAutoClose() {
|
|
219
|
+
if (this.closed)
|
|
220
|
+
return;
|
|
221
|
+
if (this.maxIdleIfEmptyMs === undefined || this.maxIdleIfEmptyMs < 1)
|
|
222
|
+
return;
|
|
223
|
+
this._autoCloseTimer = setTimeout(() => {
|
|
224
|
+
if (this.closed)
|
|
225
|
+
return;
|
|
226
|
+
if (this.observedClients.size > 0)
|
|
227
|
+
return;
|
|
228
|
+
logger.debug(`Call ${this.callId} is empty for ${this.maxIdleIfEmptyMs}ms, closing...`);
|
|
229
|
+
this.close();
|
|
230
|
+
}, this.maxIdleIfEmptyMs);
|
|
231
|
+
}
|
|
206
232
|
}
|
|
207
233
|
exports.ObservedCall = ObservedCall;
|
|
@@ -1,18 +1,18 @@
|
|
|
1
1
|
import { ObservedCall } from './ObservedCall';
|
|
2
|
-
import { ObservedCertificate } from './ObservedCertificate';
|
|
2
|
+
import { ObservedCertificate } from './webrtc/ObservedCertificate';
|
|
3
3
|
import { ObservedClient } from './ObservedClient';
|
|
4
|
-
import { ObservedCodec } from './ObservedCodec';
|
|
5
|
-
import { ObservedDataChannel } from './ObservedDataChannel';
|
|
6
|
-
import { ObservedIceCandidate } from './ObservedIceCandidate';
|
|
7
|
-
import { ObservedIceCandidatePair } from './ObservedIceCandidatePair';
|
|
8
|
-
import { ObservedIceTransport } from './ObservedIceTransport';
|
|
9
|
-
import { ObservedInboundRtp } from './ObservedInboundRtp';
|
|
10
|
-
import { ObservedInboundTrack } from './ObservedInboundTrack';
|
|
11
|
-
import { ObservedMediaPlayout } from './ObservedMediaPlayout';
|
|
12
|
-
import { ObservedMediaSource } from './ObservedMediaSource';
|
|
13
|
-
import { ObservedOutboundRtp } from './ObservedOutboundRtp';
|
|
14
|
-
import { ObservedOutboundTrack } from './ObservedOutboundTrack';
|
|
15
|
-
import { ObservedPeerConnection } from './ObservedPeerConnection';
|
|
4
|
+
import { ObservedCodec } from './webrtc/ObservedCodec';
|
|
5
|
+
import { ObservedDataChannel } from './webrtc/ObservedDataChannel';
|
|
6
|
+
import { ObservedIceCandidate } from './webrtc/ObservedIceCandidate';
|
|
7
|
+
import { ObservedIceCandidatePair } from './webrtc/ObservedIceCandidatePair';
|
|
8
|
+
import { ObservedIceTransport } from './webrtc/ObservedIceTransport';
|
|
9
|
+
import { ObservedInboundRtp } from './webrtc/ObservedInboundRtp';
|
|
10
|
+
import { ObservedInboundTrack } from './webrtc/ObservedInboundTrack';
|
|
11
|
+
import { ObservedMediaPlayout } from './webrtc/ObservedMediaPlayout';
|
|
12
|
+
import { ObservedMediaSource } from './webrtc/ObservedMediaSource';
|
|
13
|
+
import { ObservedOutboundRtp } from './webrtc/ObservedOutboundRtp';
|
|
14
|
+
import { ObservedOutboundTrack } from './webrtc/ObservedOutboundTrack';
|
|
15
|
+
import { ObservedPeerConnection } from './webrtc/ObservedPeerConnection';
|
|
16
16
|
import { ClientEvent, ClientIssue, ClientMetaData, ClientSample, ExtensionStat } from './schema/ClientSample';
|
|
17
17
|
export declare class ObservedCallEventMonitor<Context> {
|
|
18
18
|
readonly call: ObservedCall;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ObservedCallEventMonitor.d.ts","sourceRoot":"","sources":["../src/ObservedCallEventMonitor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,mBAAmB,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"ObservedCallEventMonitor.d.ts","sourceRoot":"","sources":["../src/ObservedCallEventMonitor.ts"],"names":[],"mappings":"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"}
|
|
@@ -117,7 +117,7 @@ class ObservedCallEventMonitor {
|
|
|
117
117
|
const onClientExtensionStats = (extensionStats) => this._onClientExtensionStats(observedClient, extensionStats);
|
|
118
118
|
const onUsingTurn = (usingTurn) => this._onUsingTurn(observedClient, usingTurn);
|
|
119
119
|
const onUserMediaError = (error) => this._onUserMediaError(observedClient, error);
|
|
120
|
-
const onClientUpdated = (...args) => this.onClientUpdated?.(observedClient, args[0]
|
|
120
|
+
const onClientUpdated = (...args) => this.onClientUpdated?.(observedClient, args[0], this.context);
|
|
121
121
|
const onClientEvent = (event) => this.onClientEvent?.(observedClient, event, this.context);
|
|
122
122
|
observedClient.once('close', () => {
|
|
123
123
|
observedClient.off('newpeerconnection', this._onPeerConnconnectionAdded);
|
package/lib/ObservedClient.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/// <reference types="node" />
|
|
2
2
|
import { EventEmitter } from 'events';
|
|
3
|
-
import { ObservedPeerConnection } from './ObservedPeerConnection';
|
|
3
|
+
import { ObservedPeerConnection } from './webrtc/ObservedPeerConnection';
|
|
4
4
|
import { ClientEvent, ClientMetaData, ClientSample, ClientIssue, ExtensionStat } from './schema/ClientSample';
|
|
5
5
|
import * as MetaData from './schema/ClientMetaTypes';
|
|
6
6
|
import { ObservedCall } from './ObservedCall';
|
|
@@ -8,15 +8,11 @@ import { CalculatedScore } from './scores/CalculatedScore';
|
|
|
8
8
|
import { Detectors } from './detectors/Detectors';
|
|
9
9
|
export type ObservedClientSettings<AppData extends Record<string, unknown> = Record<string, unknown>> = {
|
|
10
10
|
clientId: string;
|
|
11
|
+
maxIdleTimeMs?: number;
|
|
11
12
|
appData?: AppData;
|
|
12
13
|
};
|
|
13
14
|
export type ObservedClientEvents = {
|
|
14
|
-
update: [
|
|
15
|
-
{
|
|
16
|
-
sample: ClientSample;
|
|
17
|
-
elapsedTimeInMs: number;
|
|
18
|
-
}
|
|
19
|
-
];
|
|
15
|
+
update: [sample: ClientSample, elapsedTimeInMs: number];
|
|
20
16
|
close: [];
|
|
21
17
|
joined: [];
|
|
22
18
|
issue: [ClientIssue];
|
|
@@ -36,12 +32,11 @@ export declare interface ObservedClient {
|
|
|
36
32
|
emit<U extends keyof ObservedClientEvents>(event: U, ...args: ObservedClientEvents[U]): boolean;
|
|
37
33
|
}
|
|
38
34
|
export declare class ObservedClient<AppData extends Record<string, unknown> = Record<string, unknown>> extends EventEmitter {
|
|
35
|
+
readonly settings: ObservedClientSettings<AppData>;
|
|
39
36
|
readonly call: ObservedCall;
|
|
40
37
|
readonly detectors: Detectors;
|
|
41
|
-
readonly clientId: string;
|
|
42
38
|
readonly observedPeerConnections: Map<string, ObservedPeerConnection>;
|
|
43
39
|
readonly calculatedScore: CalculatedScore;
|
|
44
|
-
appData: AppData;
|
|
45
40
|
attachments?: Record<string, unknown>;
|
|
46
41
|
updated: number;
|
|
47
42
|
acceptedSamples: number;
|
|
@@ -49,6 +44,7 @@ export declare class ObservedClient<AppData extends Record<string, unknown> = Re
|
|
|
49
44
|
joinedAt?: number;
|
|
50
45
|
leftAt?: number;
|
|
51
46
|
closedAt?: number;
|
|
47
|
+
lastSampleTimestamp?: number;
|
|
52
48
|
operationSystem?: MetaData.OperationSystem;
|
|
53
49
|
engine?: MetaData.Engine;
|
|
54
50
|
platform?: MetaData.Platform;
|
|
@@ -111,10 +107,14 @@ export declare class ObservedClient<AppData extends Record<string, unknown> = Re
|
|
|
111
107
|
readonly mediaDevices: MetaData.MediaDeviceInfo[];
|
|
112
108
|
issues: ClientIssue[];
|
|
113
109
|
private _injections;
|
|
110
|
+
private _autoCloseTimer?;
|
|
114
111
|
constructor(settings: ObservedClientSettings<AppData>, call: ObservedCall);
|
|
112
|
+
get clientId(): string;
|
|
113
|
+
get appData(): AppData;
|
|
115
114
|
get numberOfPeerConnections(): number;
|
|
116
115
|
get score(): number | undefined;
|
|
117
116
|
close(): void;
|
|
117
|
+
private _createAutoClose;
|
|
118
118
|
accept(sample: ClientSample): void;
|
|
119
119
|
private _processClientEvent;
|
|
120
120
|
injectMetaData(metaData: ClientMetaData): void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ObservedClient.d.ts","sourceRoot":"","sources":["../src/ObservedClient.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,EAAE,sBAAsB,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"ObservedClient.d.ts","sourceRoot":"","sources":["../src/ObservedClient.ts"],"names":[],"mappings":"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"}
|
package/lib/ObservedClient.js
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.ObservedClient = void 0;
|
|
4
4
|
const events_1 = require("events");
|
|
5
|
-
const ObservedPeerConnection_1 = require("./ObservedPeerConnection");
|
|
5
|
+
const ObservedPeerConnection_1 = require("./webrtc/ObservedPeerConnection");
|
|
6
6
|
const logger_1 = require("./common/logger");
|
|
7
7
|
const ClientEventTypes_1 = require("./schema/ClientEventTypes");
|
|
8
8
|
const ClientMetaTypes_1 = require("./schema/ClientMetaTypes");
|
|
@@ -10,15 +10,14 @@ const utils_1 = require("./common/utils");
|
|
|
10
10
|
const Detectors_1 = require("./detectors/Detectors");
|
|
11
11
|
const logger = (0, logger_1.createLogger)('ObservedClient');
|
|
12
12
|
class ObservedClient extends events_1.EventEmitter {
|
|
13
|
+
settings;
|
|
13
14
|
call;
|
|
14
15
|
detectors;
|
|
15
|
-
clientId;
|
|
16
16
|
observedPeerConnections = new Map();
|
|
17
17
|
calculatedScore = {
|
|
18
18
|
weight: 1,
|
|
19
19
|
value: undefined,
|
|
20
20
|
};
|
|
21
|
-
appData;
|
|
22
21
|
attachments;
|
|
23
22
|
updated = Date.now();
|
|
24
23
|
acceptedSamples = 0;
|
|
@@ -26,6 +25,7 @@ class ObservedClient extends events_1.EventEmitter {
|
|
|
26
25
|
joinedAt;
|
|
27
26
|
leftAt;
|
|
28
27
|
closedAt;
|
|
28
|
+
lastSampleTimestamp;
|
|
29
29
|
// the timestamp of the CLIENT_JOINED event
|
|
30
30
|
operationSystem;
|
|
31
31
|
engine;
|
|
@@ -89,14 +89,21 @@ class ObservedClient extends events_1.EventEmitter {
|
|
|
89
89
|
mediaDevices = [];
|
|
90
90
|
issues = [];
|
|
91
91
|
_injections = {};
|
|
92
|
+
_autoCloseTimer;
|
|
92
93
|
constructor(settings, call) {
|
|
93
94
|
super();
|
|
95
|
+
this.settings = settings;
|
|
94
96
|
this.call = call;
|
|
95
97
|
this.setMaxListeners(Infinity);
|
|
96
|
-
this.
|
|
97
|
-
this.appData = settings.appData ?? {};
|
|
98
|
+
this._createAutoClose();
|
|
98
99
|
this.detectors = new Detectors_1.Detectors();
|
|
99
100
|
}
|
|
101
|
+
get clientId() {
|
|
102
|
+
return this.settings.clientId;
|
|
103
|
+
}
|
|
104
|
+
get appData() {
|
|
105
|
+
return this.settings.appData ?? {};
|
|
106
|
+
}
|
|
100
107
|
get numberOfPeerConnections() {
|
|
101
108
|
return this.observedPeerConnections.size;
|
|
102
109
|
}
|
|
@@ -107,13 +114,36 @@ class ObservedClient extends events_1.EventEmitter {
|
|
|
107
114
|
if (this.closed)
|
|
108
115
|
return;
|
|
109
116
|
this.closed = true;
|
|
117
|
+
this._injections.clientEvents?.forEach((clientEvent) => this._processClientEvent(clientEvent));
|
|
118
|
+
this._injections.clientIssues?.forEach((clientIssue) => this.addIssue(clientIssue));
|
|
119
|
+
this._injections.extensionStats?.forEach((extensionStat) => this.addExtensionStats(extensionStat));
|
|
120
|
+
this._injections.clientMetaItems?.forEach((clientMetaItem) => this.addMetadata(clientMetaItem));
|
|
110
121
|
Array.from(this.observedPeerConnections.values()).forEach((peerConnection) => peerConnection.close());
|
|
122
|
+
if (!this.leftAt) {
|
|
123
|
+
this.leftAt = this.lastSampleTimestamp;
|
|
124
|
+
if (this.leftAt) {
|
|
125
|
+
this.emit('left');
|
|
126
|
+
}
|
|
127
|
+
}
|
|
111
128
|
this.closedAt = Date.now();
|
|
112
129
|
this.emit('close');
|
|
113
130
|
}
|
|
131
|
+
_createAutoClose() {
|
|
132
|
+
if (this.closed)
|
|
133
|
+
return;
|
|
134
|
+
if (this.settings.maxIdleTimeMs === undefined || this.settings.maxIdleTimeMs < 1)
|
|
135
|
+
return;
|
|
136
|
+
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
|
+
}
|
|
114
143
|
accept(sample) {
|
|
115
144
|
if (this.closed)
|
|
116
145
|
throw new Error(`Client ${this.clientId} is closed`);
|
|
146
|
+
this._createAutoClose();
|
|
117
147
|
const now = Date.now();
|
|
118
148
|
const elapsedInMs = now - this.updated;
|
|
119
149
|
const elapsedInSeconds = elapsedInMs / 1000;
|
|
@@ -248,11 +278,9 @@ class ObservedClient extends events_1.EventEmitter {
|
|
|
248
278
|
this.currentAvgRttInMs = 0 < numberOfRttMeasurements ? sumOfRtts / numberOfRttMeasurements : undefined;
|
|
249
279
|
this.calculatedScore.value = sample.score;
|
|
250
280
|
this.detectors.update();
|
|
281
|
+
this.lastSampleTimestamp = sample.timestamp;
|
|
251
282
|
// emit update
|
|
252
|
-
this.emit('update',
|
|
253
|
-
sample,
|
|
254
|
-
elapsedTimeInMs: now - this.updated,
|
|
255
|
-
});
|
|
283
|
+
this.emit('update', sample, now - this.updated);
|
|
256
284
|
this.updated = now;
|
|
257
285
|
// if result changed after update
|
|
258
286
|
if (this.calculatedScore.value) {
|
|
@@ -278,6 +306,7 @@ class ObservedClient extends events_1.EventEmitter {
|
|
|
278
306
|
logger.warn(`Client ${this.clientId} joinedAt timestamp was updated to ${event.timestamp}. the joined event will not be emitted.`);
|
|
279
307
|
}
|
|
280
308
|
}
|
|
309
|
+
logger.debug('Client %s joined at %o', this.clientId, event);
|
|
281
310
|
break;
|
|
282
311
|
}
|
|
283
312
|
case ClientEventTypes_1.ClientEventTypes.CLIENT_LEFT: {
|
|
@@ -290,6 +319,7 @@ class ObservedClient extends events_1.EventEmitter {
|
|
|
290
319
|
logger.warn(`Client ${this.clientId} leftAt timestamp was already set`);
|
|
291
320
|
}
|
|
292
321
|
}
|
|
322
|
+
logger.debug('Client %s left at %o', this.clientId, event);
|
|
293
323
|
break;
|
|
294
324
|
}
|
|
295
325
|
case ClientEventTypes_1.ClientEventTypes.PEER_CONNECTION_OPENED: {
|
|
@@ -303,7 +333,7 @@ class ObservedClient extends events_1.EventEmitter {
|
|
|
303
333
|
postBuffer.push(event);
|
|
304
334
|
}
|
|
305
335
|
else {
|
|
306
|
-
logger.warn('Received PEER_CONNECTION_OPENED event without a corresponding observedPeerConnection', event);
|
|
336
|
+
logger.warn('Received PEER_CONNECTION_OPENED event without a corresponding observedPeerConnection: %o', event);
|
|
307
337
|
}
|
|
308
338
|
}
|
|
309
339
|
break;
|
|
@@ -319,7 +349,7 @@ class ObservedClient extends events_1.EventEmitter {
|
|
|
319
349
|
postBuffer.push(event);
|
|
320
350
|
}
|
|
321
351
|
else {
|
|
322
|
-
logger.warn('Received PEER_CONNECTION_CLOSED event without a corresponding observedPeerConnection', event);
|
|
352
|
+
logger.warn('Received PEER_CONNECTION_CLOSED event without a corresponding observedPeerConnection: %o', event);
|
|
323
353
|
}
|
|
324
354
|
}
|
|
325
355
|
break;
|
|
@@ -336,7 +366,7 @@ class ObservedClient extends events_1.EventEmitter {
|
|
|
336
366
|
postBuffer.push(event);
|
|
337
367
|
}
|
|
338
368
|
else {
|
|
339
|
-
logger.warn('Received MEDIA_TRACK_ADDED event without a corresponding observedPeerConnection or observedTrack', event);
|
|
369
|
+
logger.warn('Received MEDIA_TRACK_ADDED event without a corresponding observedPeerConnection or observedTrack: %o', event);
|
|
340
370
|
}
|
|
341
371
|
}
|
|
342
372
|
break;
|
|
@@ -353,7 +383,7 @@ class ObservedClient extends events_1.EventEmitter {
|
|
|
353
383
|
postBuffer.push(event);
|
|
354
384
|
}
|
|
355
385
|
else {
|
|
356
|
-
logger.warn('Received MEDIA_TRACK_REMOVED event without a corresponding observedPeerConnection or observedTrack', event);
|
|
386
|
+
logger.warn('Received MEDIA_TRACK_REMOVED event without a corresponding observedPeerConnection or observedTrack: %o', event);
|
|
357
387
|
}
|
|
358
388
|
}
|
|
359
389
|
break;
|
|
@@ -370,7 +400,7 @@ class ObservedClient extends events_1.EventEmitter {
|
|
|
370
400
|
postBuffer.push(event);
|
|
371
401
|
}
|
|
372
402
|
else {
|
|
373
|
-
logger.warn('Received DATA_CHANNEL_OPENED event without a corresponding observedPeerConnection or observedDataChannel', event);
|
|
403
|
+
logger.warn('Received DATA_CHANNEL_OPENED event without a corresponding observedPeerConnection or observedDataChannel: %o', event);
|
|
374
404
|
}
|
|
375
405
|
}
|
|
376
406
|
break;
|
|
@@ -387,7 +417,7 @@ class ObservedClient extends events_1.EventEmitter {
|
|
|
387
417
|
postBuffer.push(event);
|
|
388
418
|
}
|
|
389
419
|
else {
|
|
390
|
-
logger.warn('Received DATA_CHANNEL_CLOSE event without a corresponding observedPeerConnection or observedDataChannel', event);
|
|
420
|
+
logger.warn('Received DATA_CHANNEL_CLOSE event without a corresponding observedPeerConnection or observedDataChannel: %o', event);
|
|
391
421
|
}
|
|
392
422
|
}
|
|
393
423
|
break;
|
|
@@ -412,7 +442,7 @@ class ObservedClient extends events_1.EventEmitter {
|
|
|
412
442
|
postBuffer.push(event);
|
|
413
443
|
}
|
|
414
444
|
else {
|
|
415
|
-
logger.warn('Received MEDIA_TRACK_MUTED event without a corresponding observedPeerConnection or observedTrack', event);
|
|
445
|
+
logger.warn('Received MEDIA_TRACK_MUTED event without a corresponding observedPeerConnection or observedTrack: %o', event);
|
|
416
446
|
}
|
|
417
447
|
}
|
|
418
448
|
break;
|
|
@@ -437,7 +467,64 @@ class ObservedClient extends events_1.EventEmitter {
|
|
|
437
467
|
postBuffer.push(event);
|
|
438
468
|
}
|
|
439
469
|
else {
|
|
440
|
-
logger.warn('Received MEDIA_TRACK_UNMUTED event without a corresponding observedPeerConnection or observedTrack', event);
|
|
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);
|
|
441
528
|
}
|
|
442
529
|
}
|
|
443
530
|
break;
|