@observertc/observer-js 1.0.1-9d3744d.0 → 1.0.1-a6fb9d3.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 +8 -7
- package/lib/ObservedCall.d.ts.map +1 -1
- package/lib/ObservedCall.js +42 -38
- package/lib/ObservedCallEventMonitor.d.ts +104 -0
- package/lib/ObservedCallEventMonitor.d.ts.map +1 -0
- package/lib/ObservedCallEventMonitor.js +314 -0
- package/lib/ObservedClient.d.ts +20 -10
- package/lib/ObservedClient.d.ts.map +1 -1
- package/lib/ObservedClient.js +330 -13
- package/lib/ObservedClientEventMonitor.d.ts +91 -0
- package/lib/ObservedClientEventMonitor.d.ts.map +1 -0
- package/lib/ObservedClientEventMonitor.js +254 -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 +9 -6
- package/lib/Observer.d.ts.map +1 -1
- package/lib/Observer.js +26 -25
- package/lib/ObserverEventMonitor.d.ts +138 -0
- package/lib/ObserverEventMonitor.d.ts.map +1 -0
- package/lib/ObserverEventMonitor.js +433 -0
- package/lib/common/ObserverSummary.d.ts.map +1 -0
- package/lib/common/SummaryTypes.d.ts +75 -0
- package/lib/common/SummaryTypes.d.ts.map +1 -0
- package/lib/common/SummaryTypes.js +2 -0
- package/lib/index.d.ts +19 -17
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +21 -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/monitors/SummaryMonitor.d.ts +19 -0
- package/lib/monitors/SummaryMonitor.d.ts.map +1 -0
- package/lib/monitors/SummaryMonitor.js +129 -0
- package/lib/schema/ClientEventTypes.d.ts +147 -19
- package/lib/schema/ClientEventTypes.d.ts.map +1 -1
- package/lib/schema/ClientEventTypes.js +5 -2
- package/lib/schema/ClientSample.d.ts +1 -1
- package/lib/schema/ClientSample.d.ts.map +1 -1
- package/lib/updaters/{OnAllCallObserverUpdater_.d.ts → OnAllCallObserverUpdater.d.ts} +3 -1
- package/lib/updaters/OnAllCallObserverUpdater.d.ts.map +1 -0
- package/lib/updaters/{OnAllCallObserverUpdater_.js → OnAllCallObserverUpdater.js} +13 -1
- package/lib/updaters/OnAllClientCallUpdater.d.ts +2 -0
- package/lib/updaters/OnAllClientCallUpdater.d.ts.map +1 -1
- package/lib/updaters/OnAllClientCallUpdater.js +16 -0
- package/lib/updaters/{OnAnyCallObserverUpdater_.d.ts → OnAnyCallObserverUpdater.d.ts} +2 -1
- package/lib/updaters/OnAnyCallObserverUpdater.d.ts.map +1 -0
- package/lib/updaters/{OnAnyCallObserverUpdater_.js → OnAnyCallObserverUpdater.js} +11 -1
- package/lib/updaters/OnAnyClientCallUpdater.d.ts +1 -0
- package/lib/updaters/OnAnyClientCallUpdater.d.ts.map +1 -1
- package/lib/updaters/OnAnyClientCallUpdater.js +11 -2
- 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} +3 -1
- package/lib/webrtc/ObservedDataChannel.d.ts.map +1 -0
- package/lib/{ObservedDataChannel.js → webrtc/ObservedDataChannel.js} +2 -0
- package/lib/{ObservedIceCandidate.d.ts → webrtc/ObservedIceCandidate.d.ts} +1 -1
- package/lib/webrtc/ObservedIceCandidate.d.ts.map +1 -0
- package/lib/{ObservedIceCandidatePair.d.ts → webrtc/ObservedIceCandidatePair.d.ts} +3 -2
- package/lib/webrtc/ObservedIceCandidatePair.d.ts.map +1 -0
- package/lib/{ObservedIceCandidatePair.js → webrtc/ObservedIceCandidatePair.js} +17 -1
- package/lib/{ObservedIceTransport.d.ts → webrtc/ObservedIceTransport.d.ts} +1 -1
- package/lib/webrtc/ObservedIceTransport.d.ts.map +1 -0
- package/lib/{ObservedInboundRtp.d.ts → webrtc/ObservedInboundRtp.d.ts} +2 -2
- package/lib/webrtc/ObservedInboundRtp.d.ts.map +1 -0
- package/lib/{ObservedInboundTrack.d.ts → webrtc/ObservedInboundTrack.d.ts} +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} +26 -4
- package/lib/webrtc/ObservedPeerConnection.d.ts.map +1 -0
- package/lib/{ObservedPeerConnection.js → webrtc/ObservedPeerConnection.js} +82 -17
- package/lib/{ObservedPeerConnectionTransport.d.ts → webrtc/ObservedPeerConnectionTransport.d.ts} +1 -1
- package/lib/webrtc/ObservedPeerConnectionTransport.d.ts.map +1 -0
- package/lib/{ObservedRemoteInboundRtp.d.ts → webrtc/ObservedRemoteInboundRtp.d.ts} +2 -2
- package/lib/webrtc/ObservedRemoteInboundRtp.d.ts.map +1 -0
- package/lib/{ObservedRemoteOutboundRtp.d.ts → webrtc/ObservedRemoteOutboundRtp.d.ts} +2 -2
- package/lib/webrtc/ObservedRemoteOutboundRtp.d.ts.map +1 -0
- package/package.json +1 -1
- package/src/ObservedCall.ts +44 -48
- package/src/ObservedCallEventMonitor.ts +392 -0
- package/src/ObservedClient.ts +363 -22
- package/src/ObservedClientEventMonitor.ts +309 -0
- package/src/ObservedTURN.ts +2 -1
- package/src/ObservedTurnServer.ts +2 -2
- package/src/Observer.ts +37 -33
- package/src/ObserverEventMonitor.ts +551 -0
- package/src/common/SummaryTypes.ts +91 -0
- package/src/index.ts +19 -18
- package/src/mediasoup/ObservedMediasoupRouter.ts +12 -0
- package/src/monitors/SummaryMonitor.ts +181 -0
- package/src/schema/ClientEventTypes.ts +187 -19
- package/src/schema/ClientSample.ts +1 -1
- package/src/updaters/{OnAllCallObserverUpdater_.ts → OnAllCallObserverUpdater.ts} +14 -1
- package/src/updaters/OnAllClientCallUpdater.ts +15 -0
- package/src/updaters/{OnAnyCallObserverUpdater_.ts → OnAnyCallObserverUpdater.ts} +12 -3
- package/src/updaters/OnAnyClientCallUpdater.ts +9 -2
- 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} +4 -1
- package/src/{ObservedIceCandidate.ts → webrtc/ObservedIceCandidate.ts} +1 -1
- package/src/{ObservedIceCandidatePair.ts → webrtc/ObservedIceCandidatePair.ts} +19 -3
- package/src/{ObservedIceTransport.ts → webrtc/ObservedIceTransport.ts} +1 -1
- package/src/{ObservedInboundRtp.ts → webrtc/ObservedInboundRtp.ts} +2 -2
- package/src/{ObservedInboundTrack.ts → webrtc/ObservedInboundTrack.ts} +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} +124 -37
- package/src/{ObservedPeerConnectionTransport.ts → webrtc/ObservedPeerConnectionTransport.ts} +1 -1
- package/src/{ObservedRemoteInboundRtp.ts → webrtc/ObservedRemoteInboundRtp.ts} +2 -2
- package/src/{ObservedRemoteOutboundRtp.ts → webrtc/ObservedRemoteOutboundRtp.ts} +2 -2
- package/lib/ObservedCertificate.d.ts.map +0 -1
- package/lib/ObservedCodec.d.ts.map +0 -1
- package/lib/ObservedDataChannel.d.ts.map +0 -1
- package/lib/ObservedIceCandidate.d.ts.map +0 -1
- package/lib/ObservedIceCandidatePair.d.ts.map +0 -1
- package/lib/ObservedIceTransport.d.ts.map +0 -1
- package/lib/ObservedInboundRtp.d.ts.map +0 -1
- package/lib/ObservedInboundTrack.d.ts.map +0 -1
- package/lib/ObservedMediaPlayout.d.ts.map +0 -1
- package/lib/ObservedMediaSource.d.ts.map +0 -1
- package/lib/ObservedOutboundRtp.d.ts.map +0 -1
- package/lib/ObservedOutboundTrack.d.ts.map +0 -1
- package/lib/ObservedPeerConnection.d.ts.map +0 -1
- package/lib/ObservedPeerConnectionTransport.d.ts.map +0 -1
- package/lib/ObservedRemoteInboundRtp.d.ts.map +0 -1
- package/lib/ObservedRemoteOutboundRtp.d.ts.map +0 -1
- package/lib/ObserverSummary.d.ts.map +0 -1
- package/lib/updaters/OnAllCallObserverUpdater_.d.ts.map +0 -1
- package/lib/updaters/OnAnyCallObserverUpdater_.d.ts.map +0 -1
- /package/lib/{ObserverSummary.d.ts → common/ObserverSummary.d.ts} +0 -0
- /package/lib/{ObserverSummary.js → common/ObserverSummary.js} +0 -0
- /package/lib/{ObservedCertificate.js → webrtc/ObservedCertificate.js} +0 -0
- /package/lib/{ObservedCodec.js → webrtc/ObservedCodec.js} +0 -0
- /package/lib/{ObservedIceCandidate.js → webrtc/ObservedIceCandidate.js} +0 -0
- /package/lib/{ObservedIceTransport.js → webrtc/ObservedIceTransport.js} +0 -0
- /package/lib/{ObservedInboundRtp.js → webrtc/ObservedInboundRtp.js} +0 -0
- /package/lib/{ObservedMediaPlayout.js → webrtc/ObservedMediaPlayout.js} +0 -0
- /package/lib/{ObservedMediaSource.js → webrtc/ObservedMediaSource.js} +0 -0
- /package/lib/{ObservedOutboundRtp.js → webrtc/ObservedOutboundRtp.js} +0 -0
- /package/lib/{ObservedPeerConnectionTransport.js → webrtc/ObservedPeerConnectionTransport.js} +0 -0
- /package/lib/{ObservedRemoteInboundRtp.js → webrtc/ObservedRemoteInboundRtp.js} +0 -0
- /package/lib/{ObservedRemoteOutboundRtp.js → webrtc/ObservedRemoteOutboundRtp.js} +0 -0
- /package/src/{ObserverSummary.ts → common/ObserverSummary.ts} +0 -0
package/src/index.ts
CHANGED
|
@@ -2,26 +2,27 @@ export type { ObserverEvents } from './Observer';
|
|
|
2
2
|
|
|
3
3
|
export { Observer } from './Observer';
|
|
4
4
|
export { ObservedCall } from './ObservedCall';
|
|
5
|
-
export { ObservedInboundTrack } from './ObservedInboundTrack';
|
|
6
|
-
export { ObservedOutboundTrack } from './ObservedOutboundTrack';
|
|
5
|
+
export { ObservedInboundTrack } from './webrtc/ObservedInboundTrack';
|
|
6
|
+
export { ObservedOutboundTrack } from './webrtc/ObservedOutboundTrack';
|
|
7
7
|
export { ObservedClient } from './ObservedClient';
|
|
8
|
-
export { ObservedPeerConnection } from './ObservedPeerConnection';
|
|
9
|
-
export { ObservedMediaSource } from './ObservedMediaSource';
|
|
10
|
-
export { ObservedMediaPlayout } from './ObservedMediaPlayout';
|
|
11
|
-
export { ObservedCodec } from './ObservedCodec';
|
|
12
|
-
export { ObservedCertificate } from './ObservedCertificate';
|
|
13
|
-
export { ObservedDataChannel } from './ObservedDataChannel';
|
|
14
|
-
export { ObservedInboundRtp } from './ObservedInboundRtp';
|
|
15
|
-
export { ObservedOutboundRtp } from './ObservedOutboundRtp';
|
|
16
|
-
export { ObservedRemoteInboundRtp } from './ObservedRemoteInboundRtp';
|
|
17
|
-
export { ObservedRemoteOutboundRtp } from './ObservedRemoteOutboundRtp';
|
|
18
|
-
export { ObservedIceCandidatePair } from './ObservedIceCandidatePair';
|
|
19
|
-
export { ObservedIceCandidate } from './ObservedIceCandidate';
|
|
20
|
-
export { ObservedIceTransport } from './ObservedIceTransport';
|
|
21
|
-
export { ObservedPeerConnectionTransport } from './ObservedPeerConnectionTransport';
|
|
8
|
+
export { ObservedPeerConnection } from './webrtc/ObservedPeerConnection';
|
|
9
|
+
export { ObservedMediaSource } from './webrtc/ObservedMediaSource';
|
|
10
|
+
export { ObservedMediaPlayout } from './webrtc/ObservedMediaPlayout';
|
|
11
|
+
export { ObservedCodec } from './webrtc/ObservedCodec';
|
|
12
|
+
export { ObservedCertificate } from './webrtc/ObservedCertificate';
|
|
13
|
+
export { ObservedDataChannel } from './webrtc/ObservedDataChannel';
|
|
14
|
+
export { ObservedInboundRtp } from './webrtc/ObservedInboundRtp';
|
|
15
|
+
export { ObservedOutboundRtp } from './webrtc/ObservedOutboundRtp';
|
|
16
|
+
export { ObservedRemoteInboundRtp } from './webrtc/ObservedRemoteInboundRtp';
|
|
17
|
+
export { ObservedRemoteOutboundRtp } from './webrtc/ObservedRemoteOutboundRtp';
|
|
18
|
+
export { ObservedIceCandidatePair } from './webrtc/ObservedIceCandidatePair';
|
|
19
|
+
export { ObservedIceCandidate } from './webrtc/ObservedIceCandidate';
|
|
20
|
+
export { ObservedIceTransport } from './webrtc/ObservedIceTransport';
|
|
21
|
+
export { ObservedPeerConnectionTransport } from './webrtc/ObservedPeerConnectionTransport';
|
|
22
22
|
export { ClientEventTypes } from './schema/ClientEventTypes';
|
|
23
23
|
export { ClientMetaTypes } from './schema/ClientMetaTypes';
|
|
24
|
-
export { ClientSample } from './schema/ClientSample';
|
|
24
|
+
export { ClientSample, ClientIssue, ClientEvent, ClientMetaData } from './schema/ClientSample';
|
|
25
25
|
export { ScoreCalculator } from './scores/ScoreCalculator';
|
|
26
|
-
|
|
26
|
+
export { ObservedClientEventMonitor } from './ObservedClientEventMonitor';
|
|
27
|
+
export { ObserverEventMonitor } from './ObserverEventMonitor';
|
|
27
28
|
export { Middleware } from './common/Middleware';
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { Observer } from "../Observer";
|
|
2
|
+
|
|
3
|
+
export class ObservedMediasoupRouter<T extends Record<string, unknown> = Record<string, unknown>> {
|
|
4
|
+
public readonly appData: T;
|
|
5
|
+
public constructor(
|
|
6
|
+
public readonly parent: Observer,
|
|
7
|
+
appData?: T
|
|
8
|
+
) {
|
|
9
|
+
this.appData = appData ?? {} as T;
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
|
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
import { EventEmitter } from "events";
|
|
2
|
+
import { CallSummary, ClientSummary } from "../common/SummaryTypes";
|
|
3
|
+
import { ObservedCall } from "../ObservedCall";
|
|
4
|
+
import { Observer } from "../Observer";
|
|
5
|
+
import { createLogger } from "../common/logger";
|
|
6
|
+
import { ObservedClient } from "../ObservedClient";
|
|
7
|
+
import { ClientSample } from "../schema/ClientSample";
|
|
8
|
+
|
|
9
|
+
const logger = createLogger("SummaryMonitor");
|
|
10
|
+
|
|
11
|
+
export type SummaryMonitorEvents = {
|
|
12
|
+
'call-summary': [CallSummary]
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
export interface OngoingCallSumariesMap {
|
|
16
|
+
create(call: CallSummary): void | Promise<void>;
|
|
17
|
+
update(call: CallSummary): void | Promise<void>;
|
|
18
|
+
read(callId: string): Promise<CallSummary | undefined>;
|
|
19
|
+
delete(callId: string): void | Promise<void>;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
export class SummaryMonitor extends EventEmitter {
|
|
24
|
+
|
|
25
|
+
public constructor(
|
|
26
|
+
public readonly callSummaries = createSimpleOngoingCallSummariesMap(),
|
|
27
|
+
) {
|
|
28
|
+
super();
|
|
29
|
+
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
export function createSummaryMonitor(observer: Observer): SummaryMonitor {
|
|
34
|
+
const result = new SummaryMonitor();
|
|
35
|
+
const eventer = observer.createEventMonitor(result);
|
|
36
|
+
|
|
37
|
+
eventer.onCallAdded = onCallAdded;
|
|
38
|
+
eventer.onCallUpdated = onCallUpdated;
|
|
39
|
+
eventer.onCallRemoved = onCallRemoved;
|
|
40
|
+
eventer.onClientAdded = onClientAdded;
|
|
41
|
+
eventer.onClientUpdated = onClientUpdated;
|
|
42
|
+
eventer.onClientClosed = onClientClosed;
|
|
43
|
+
|
|
44
|
+
return result;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
async function onCallAdded(call: ObservedCall, monitor: SummaryMonitor) {
|
|
48
|
+
const summary: CallSummary = {
|
|
49
|
+
startedAt: call.startedAt ?? Date.now(),
|
|
50
|
+
id: call.callId,
|
|
51
|
+
attachments: {},
|
|
52
|
+
clients: {},
|
|
53
|
+
issues: {},
|
|
54
|
+
totalScore: 0,
|
|
55
|
+
numberOfScores: 0,
|
|
56
|
+
scoreReasons: {}
|
|
57
|
+
};
|
|
58
|
+
|
|
59
|
+
await monitor.callSummaries.create(summary);
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
async function onCallUpdated(call: ObservedCall, monitor: SummaryMonitor) {
|
|
63
|
+
const summary = await monitor.callSummaries.read(call.callId);
|
|
64
|
+
|
|
65
|
+
if (!summary) return logger.warn(`Call summary not found for call ID ${call.callId}`);
|
|
66
|
+
|
|
67
|
+
// Update the summary with the latest call data
|
|
68
|
+
if (call.startedAt) {
|
|
69
|
+
summary.startedAt = call.startedAt;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
if (call.score !== undefined) {
|
|
73
|
+
summary.totalScore += call.score;
|
|
74
|
+
++summary.numberOfScores;
|
|
75
|
+
|
|
76
|
+
summary.liveState = {
|
|
77
|
+
...summary.liveState,
|
|
78
|
+
score: call.score
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
await monitor.callSummaries.update(summary);
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
async function onCallRemoved(call: ObservedCall, monitor: SummaryMonitor) {
|
|
86
|
+
const summary = await monitor.callSummaries.read(call.callId);
|
|
87
|
+
|
|
88
|
+
if (!summary) return logger.warn(`Call summary not found for call ID ${call.callId}`);
|
|
89
|
+
|
|
90
|
+
summary.liveState = undefined;
|
|
91
|
+
|
|
92
|
+
await monitor.callSummaries.delete(call.callId);
|
|
93
|
+
|
|
94
|
+
monitor.emit('call-summary', summary);
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
|
|
98
|
+
async function onClientAdded(client: ObservedClient, monitor: SummaryMonitor) {
|
|
99
|
+
const callSummary = await monitor.callSummaries.read(client.call.callId);
|
|
100
|
+
|
|
101
|
+
if (!callSummary) return logger.warn(`Call summary not found for call ID ${client.call.callId}`);
|
|
102
|
+
|
|
103
|
+
const clientSummary: ClientSummary = {
|
|
104
|
+
id: client.clientId,
|
|
105
|
+
attachments: {},
|
|
106
|
+
joinedAt: client.joinedAt ?? Date.now(),
|
|
107
|
+
leftAt: client.leftAt,
|
|
108
|
+
peerConnections: {},
|
|
109
|
+
issues: {},
|
|
110
|
+
totalScore: 0,
|
|
111
|
+
numberOfScores: 0,
|
|
112
|
+
scoreReasons: {}
|
|
113
|
+
};
|
|
114
|
+
|
|
115
|
+
callSummary.clients[client.clientId] = clientSummary;
|
|
116
|
+
|
|
117
|
+
await monitor.callSummaries.update(callSummary);
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
async function onClientUpdated(client: ObservedClient, sample: ClientSample, monitor: SummaryMonitor) {
|
|
121
|
+
const callSummary = await monitor.callSummaries.read(client.call.callId);
|
|
122
|
+
|
|
123
|
+
if (!callSummary) return logger.warn(`Call summary not found for call ID ${client.call.callId}`);
|
|
124
|
+
|
|
125
|
+
const clientSummary = callSummary.clients[client.clientId];
|
|
126
|
+
|
|
127
|
+
if (!clientSummary) return logger.warn(`Client summary not found for client ID ${client.clientId} in call ID ${callSummary.id}`);
|
|
128
|
+
|
|
129
|
+
if (client.score !== undefined) {
|
|
130
|
+
clientSummary.totalScore += client.score;
|
|
131
|
+
++clientSummary.numberOfScores;
|
|
132
|
+
|
|
133
|
+
clientSummary.liveState = {
|
|
134
|
+
...clientSummary.liveState,
|
|
135
|
+
score: client.score
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
await monitor.callSummaries.update(callSummary);
|
|
140
|
+
|
|
141
|
+
sample;
|
|
142
|
+
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
async function onClientClosed(client: ObservedClient, monitor: SummaryMonitor) {
|
|
146
|
+
const callSummary = await monitor.callSummaries.read(client.call.callId);
|
|
147
|
+
|
|
148
|
+
if (!callSummary) return logger.warn(`Call summary not found for call ID ${client.call.callId}`);
|
|
149
|
+
|
|
150
|
+
const clientSummary = callSummary.clients[client.clientId];
|
|
151
|
+
|
|
152
|
+
if (!clientSummary) return logger.warn(`Client summary not found for client ID ${client.clientId} in call ID ${callSummary.id}`);
|
|
153
|
+
|
|
154
|
+
clientSummary.leftAt = client.leftAt ?? Date.now();
|
|
155
|
+
|
|
156
|
+
await monitor.callSummaries.update(callSummary);
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
|
|
160
|
+
|
|
161
|
+
|
|
162
|
+
// -----------------------------------------------------
|
|
163
|
+
|
|
164
|
+
function createSimpleOngoingCallSummariesMap(): OngoingCallSumariesMap {
|
|
165
|
+
const map = new Map<string, CallSummary>();
|
|
166
|
+
|
|
167
|
+
return {
|
|
168
|
+
create(call: CallSummary) {
|
|
169
|
+
map.set(call.id, call);
|
|
170
|
+
},
|
|
171
|
+
update(call: CallSummary) {
|
|
172
|
+
// empty
|
|
173
|
+
},
|
|
174
|
+
async read(callId: string) {
|
|
175
|
+
return map.get(callId);
|
|
176
|
+
},
|
|
177
|
+
delete(callId: string) {
|
|
178
|
+
map.delete(callId);
|
|
179
|
+
}
|
|
180
|
+
};
|
|
181
|
+
}
|
|
@@ -18,9 +18,10 @@ export enum ClientEventTypes {
|
|
|
18
18
|
DATA_CHANNEL_ERROR = 'DATA_CHANNEL_ERROR',
|
|
19
19
|
NEGOTIATION_NEEDED = 'NEGOTIATION_NEEDED',
|
|
20
20
|
SIGNALING_STATE_CHANGE = 'SIGNALING_STATE_CHANGE',
|
|
21
|
-
ICE_GATHERING_STATE_CHANGE = 'ICE_GATHERING_STATE_CHANGE',
|
|
22
|
-
ICE_CONNECTION_STATE_CHANGE = 'ICE_CONNECTION_STATE_CHANGE',
|
|
21
|
+
// ICE_GATHERING_STATE_CHANGE = 'ICE_GATHERING_STATE_CHANGE',
|
|
22
|
+
// ICE_CONNECTION_STATE_CHANGE = 'ICE_CONNECTION_STATE_CHANGE',
|
|
23
23
|
ICE_CANDIDATE = 'ICE_CANDIDATE',
|
|
24
|
+
ICE_CANDIDATE_ERROR = 'ICE_CANDIDATE_ERROR',
|
|
24
25
|
|
|
25
26
|
// mediasoup events
|
|
26
27
|
PRODUCER_ADDED = 'PRODUCER_ADDED',
|
|
@@ -29,27 +30,39 @@ export enum ClientEventTypes {
|
|
|
29
30
|
PRODUCER_RESUMED = 'PRODUCER_RESUMED',
|
|
30
31
|
CONSUMER_ADDED = 'CONSUMER_ADDED',
|
|
31
32
|
CONSUMER_REMOVED = 'CONSUMER_REMOVED',
|
|
33
|
+
CONSUMER_PAUSED = 'CONSUMER_PAUSED',
|
|
34
|
+
CONSUMER_RESUMED = 'CONSUMER_RESUMED',
|
|
32
35
|
DATA_PRODUCER_CREATED = 'DATA_PRODUCER_CREATED',
|
|
33
36
|
DATA_PRODUCER_CLOSED = 'DATA_PRODUCER_CLOSED',
|
|
34
37
|
DATA_CONSUMER_CREATED = 'DATA_CONSUMER_CREATED',
|
|
35
38
|
DATA_CONSUMER_CLOSED = 'DATA_CONSUMER_CLOSED',
|
|
36
39
|
}
|
|
37
40
|
|
|
41
|
+
// eslint-disable-next-line @typescript-eslint/no-empty-interface
|
|
42
|
+
export interface ClientJoinedEventPayload extends Record<string, unknown> {
|
|
43
|
+
// empty
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
// eslint-disable-next-line @typescript-eslint/no-empty-interface
|
|
47
|
+
export interface ClientLeftEventPayload extends Record<string, unknown> {
|
|
48
|
+
}
|
|
49
|
+
|
|
38
50
|
export interface PeerConnectionOpenedEventPayload extends Record<string, unknown> {
|
|
39
51
|
peerConnectionId: string;
|
|
40
|
-
iceConnectionState
|
|
41
|
-
iceGatheringState
|
|
42
|
-
signalingState
|
|
52
|
+
iceConnectionState?: string;
|
|
53
|
+
iceGatheringState?: string;
|
|
54
|
+
signalingState?: string;
|
|
43
55
|
}
|
|
44
56
|
|
|
45
57
|
export interface PeerConnectionClosedEventPayload extends Record<string, unknown> {
|
|
46
58
|
peerConnectionId: string;
|
|
47
|
-
iceConnectionState
|
|
48
|
-
iceGatheringState
|
|
49
|
-
signalingState
|
|
59
|
+
iceConnectionState?: string;
|
|
60
|
+
iceGatheringState?: string;
|
|
61
|
+
signalingState?: string;
|
|
50
62
|
}
|
|
51
63
|
|
|
52
|
-
export interface
|
|
64
|
+
export interface MediaTrackAddedEventPayload extends Record<string, unknown> {
|
|
65
|
+
peerConnectionId: string;
|
|
53
66
|
trackId: string;
|
|
54
67
|
kind: 'audio' | 'video';
|
|
55
68
|
label?: string;
|
|
@@ -57,9 +70,13 @@ export interface MediaTrackMutedEventPayload extends Record<string, unknown> {
|
|
|
57
70
|
enabled: boolean;
|
|
58
71
|
readyState: string;
|
|
59
72
|
contentHint?: string;
|
|
73
|
+
constraints: MediaTrackConstraints,
|
|
74
|
+
capabilities: MediaTrackCapabilities,
|
|
75
|
+
settings: MediaTrackSettings,
|
|
60
76
|
}
|
|
61
77
|
|
|
62
|
-
export interface
|
|
78
|
+
export interface MediaTrackRemovedEventPayload extends Record<string, unknown> {
|
|
79
|
+
peerConnectionId: string;
|
|
63
80
|
trackId: string;
|
|
64
81
|
kind: 'audio' | 'video';
|
|
65
82
|
label?: string;
|
|
@@ -69,7 +86,8 @@ export interface MediaTrackUnmutedEventPayload extends Record<string, unknown> {
|
|
|
69
86
|
contentHint?: string;
|
|
70
87
|
}
|
|
71
88
|
|
|
72
|
-
export interface
|
|
89
|
+
export interface MediaTrackMutedEventPayload extends Record<string, unknown> {
|
|
90
|
+
peerConnectionId: string;
|
|
73
91
|
trackId: string;
|
|
74
92
|
kind: 'audio' | 'video';
|
|
75
93
|
label?: string;
|
|
@@ -77,12 +95,10 @@ export interface MediaTrackAddedEventPayload extends Record<string, unknown> {
|
|
|
77
95
|
enabled: boolean;
|
|
78
96
|
readyState: string;
|
|
79
97
|
contentHint?: string;
|
|
80
|
-
constraints: MediaTrackConstraints,
|
|
81
|
-
capabilities: MediaTrackCapabilities,
|
|
82
|
-
settings: MediaTrackSettings,
|
|
83
98
|
}
|
|
84
99
|
|
|
85
|
-
export interface
|
|
100
|
+
export interface MediaTrackUnmutedEventPayload extends Record<string, unknown> {
|
|
101
|
+
peerConnectionId: string;
|
|
86
102
|
trackId: string;
|
|
87
103
|
kind: 'audio' | 'video';
|
|
88
104
|
label?: string;
|
|
@@ -92,21 +108,173 @@ export interface MediaTrackRemovedEventPayload extends Record<string, unknown> {
|
|
|
92
108
|
contentHint?: string;
|
|
93
109
|
}
|
|
94
110
|
|
|
111
|
+
export interface IceGatheringStateChangedEventPayload extends Record<string, unknown> {
|
|
112
|
+
peerConnectionId: string;
|
|
113
|
+
iceGatheringState: string;
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
export interface PeerConnectionStateChangedEventPayload extends Record<string, unknown> {
|
|
117
|
+
peerConnectionId: string;
|
|
118
|
+
connectionState: string;
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
export interface IceConnectionStateChangedEventPayload extends Record<string, unknown> {
|
|
122
|
+
peerConnectionId: string;
|
|
123
|
+
iceConnectionState: string;
|
|
124
|
+
}
|
|
125
|
+
|
|
95
126
|
export interface DataChannelErrorEventPayload extends Record<string, unknown> {
|
|
96
127
|
label: string;
|
|
128
|
+
peerConnectionId: string;
|
|
97
129
|
readyState: string;
|
|
98
|
-
dataChannelId: string,
|
|
99
|
-
error: string,
|
|
130
|
+
dataChannelId: string | number | null,
|
|
131
|
+
error: string | null,
|
|
100
132
|
}
|
|
101
133
|
|
|
102
134
|
export interface DataChannelOpenEventPayload extends Record<string, unknown> {
|
|
135
|
+
peerConnectionId: string;
|
|
103
136
|
label: string;
|
|
104
137
|
readyState: string;
|
|
105
|
-
dataChannelId: string,
|
|
138
|
+
dataChannelId: string | number | null,
|
|
106
139
|
}
|
|
107
140
|
|
|
108
141
|
export interface DataChannelClosedEventPayload extends Record<string, unknown> {
|
|
142
|
+
peerConnectionId: string;
|
|
109
143
|
label: string;
|
|
110
144
|
readyState: string;
|
|
111
|
-
dataChannelId: string,
|
|
145
|
+
dataChannelId: string | number | null,
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
export interface NegotiationNeededEventPayload extends Record<string, unknown> {
|
|
149
|
+
peerConnectionId: string;
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
export interface IceCandidateEventPayload extends Record<string, unknown> {
|
|
153
|
+
peerConnectionId: string;
|
|
154
|
+
|
|
155
|
+
/** [MDN Reference](https://developer.mozilla.org/docs/Web/API/RTCIceCandidate/address) */
|
|
156
|
+
address?: string | null;
|
|
157
|
+
|
|
158
|
+
/** [MDN Reference](https://developer.mozilla.org/docs/Web/API/RTCIceCandidate/candidate) */
|
|
159
|
+
candidate?: string;
|
|
160
|
+
|
|
161
|
+
/** [MDN Reference](https://developer.mozilla.org/docs/Web/API/RTCIceCandidate/component) */
|
|
162
|
+
component?: RTCIceComponent | null;
|
|
163
|
+
|
|
164
|
+
/** [MDN Reference](https://developer.mozilla.org/docs/Web/API/RTCIceCandidate/foundation) */
|
|
165
|
+
foundation?: string | null;
|
|
166
|
+
|
|
167
|
+
/** [MDN Reference](https://developer.mozilla.org/docs/Web/API/RTCIceCandidate/port) */
|
|
168
|
+
port?: number | null;
|
|
169
|
+
|
|
170
|
+
/** [MDN Reference](https://developer.mozilla.org/docs/Web/API/RTCIceCandidate/priority) */
|
|
171
|
+
priority?: number | null;
|
|
172
|
+
|
|
173
|
+
/** [MDN Reference](https://developer.mozilla.org/docs/Web/API/RTCIceCandidate/protocol) */
|
|
174
|
+
protocol?: RTCIceProtocol | null;
|
|
175
|
+
|
|
176
|
+
/** [MDN Reference](https://developer.mozilla.org/docs/Web/API/RTCIceCandidate/relatedAddress) */
|
|
177
|
+
relatedAddress?: string | null;
|
|
178
|
+
|
|
179
|
+
/** [MDN Reference](https://developer.mozilla.org/docs/Web/API/RTCIceCandidate/relatedPort) */
|
|
180
|
+
relatedPort?: number | null;
|
|
181
|
+
|
|
182
|
+
/** [MDN Reference](https://developer.mozilla.org/docs/Web/API/RTCIceCandidate/sdpMLineIndex) */
|
|
183
|
+
sdpMLineIndex?: number | null;
|
|
184
|
+
|
|
185
|
+
/** [MDN Reference](https://developer.mozilla.org/docs/Web/API/RTCIceCandidate/sdpMid) */
|
|
186
|
+
sdpMid?: string | null;
|
|
187
|
+
|
|
188
|
+
/** [MDN Reference](https://developer.mozilla.org/docs/Web/API/RTCIceCandidate/tcpType) */
|
|
189
|
+
tcpType?: RTCIceTcpCandidateType | null;
|
|
190
|
+
|
|
191
|
+
/** [MDN Reference](https://developer.mozilla.org/docs/Web/API/RTCIceCandidate/type) */
|
|
192
|
+
type?: RTCIceCandidateType | null;
|
|
193
|
+
|
|
194
|
+
/** [MDN Reference](https://developer.mozilla.org/docs/Web/API/RTCIceCandidate/usernameFragment) */
|
|
195
|
+
usernameFragment?: string | null;
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
export interface IceCandidateErrorEventPayload extends Record<string, unknown> {
|
|
199
|
+
peerConnectionId: string;
|
|
200
|
+
errorCode?: number;
|
|
201
|
+
errorText?: string;
|
|
202
|
+
address?: string | null;
|
|
203
|
+
port?: number | null;
|
|
204
|
+
url?: string | null;
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
export interface SignalingStateChangedEventPayload extends Record<string, unknown> {
|
|
208
|
+
peerConnectionId: string;
|
|
209
|
+
signalingState: string;
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
export interface ProducerAddedEventPayload extends Record<string, unknown> {
|
|
213
|
+
peerConnectionId: string;
|
|
214
|
+
producerId: string;
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
export interface ProducerRemovedEventPayload extends Record<string, unknown> {
|
|
218
|
+
peerConnectionId: string;
|
|
219
|
+
producerId: string;
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
export interface ProducerPausedEventPayload extends Record<string, unknown> {
|
|
223
|
+
peerConnectionId: string;
|
|
224
|
+
producerId: string;
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
export interface ProducerResumedEventPayload extends Record<string, unknown> {
|
|
228
|
+
peerConnectionId: string;
|
|
229
|
+
producerId: string;
|
|
112
230
|
}
|
|
231
|
+
|
|
232
|
+
export interface ConsumerAddedEventPayload extends Record<string, unknown> {
|
|
233
|
+
peerConnectionId: string;
|
|
234
|
+
producerId: string;
|
|
235
|
+
consumerId: string;
|
|
236
|
+
trackId: string;
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
export interface ConsumerRemovedEventPayload extends Record<string, unknown> {
|
|
240
|
+
peerConnectionId: string;
|
|
241
|
+
producerId: string;
|
|
242
|
+
consumerId: string;
|
|
243
|
+
trackId: string;
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
export interface ConsumerPausedEventPayload extends Record<string, unknown> {
|
|
247
|
+
peerConnectionId: string;
|
|
248
|
+
producerId: string;
|
|
249
|
+
consumerId: string;
|
|
250
|
+
trackId: string;
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
export interface ConsumerResumedEventPayload extends Record<string, unknown> {
|
|
254
|
+
peerConnectionId: string;
|
|
255
|
+
producerId: string;
|
|
256
|
+
consumerId: string;
|
|
257
|
+
trackId: string;
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
export interface DataProducerCreatedEventPayload extends Record<string, unknown> {
|
|
261
|
+
peerConnectionId: string;
|
|
262
|
+
dataProducerId: string;
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
export interface DataProducerClosedEventPayload extends Record<string, unknown> {
|
|
266
|
+
peerConnectionId: string;
|
|
267
|
+
dataProducerId: string;
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
export interface DataConsumerCreatedEventPayload extends Record<string, unknown> {
|
|
271
|
+
peerConnectionId: string;
|
|
272
|
+
dataProducerId: string;
|
|
273
|
+
dataConsumerId: string;
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
export interface DataConsumerClosedEventPayload extends Record<string, unknown> {
|
|
277
|
+
peerConnectionId: string;
|
|
278
|
+
dataProducerId: string;
|
|
279
|
+
dataConsumerId: string;
|
|
280
|
+
}
|
|
@@ -170,7 +170,7 @@ export type IceCandidatePairStats = {
|
|
|
170
170
|
*/
|
|
171
171
|
remoteCandidateId?: string;
|
|
172
172
|
|
|
173
|
-
state?: 'new' | '
|
|
173
|
+
state?: 'new' | 'in-progress' | 'waiting' | 'failed' | 'succeeded' | 'cancelled' | 'inprogress';
|
|
174
174
|
|
|
175
175
|
/**
|
|
176
176
|
* Whether this candidate pair has been nominated.
|
|
@@ -7,6 +7,7 @@ export class OnAllCallObserverUpdater implements Updater {
|
|
|
7
7
|
public readonly description = 'Call Observer\'s update() method when all of the ObservedCalls are updated';
|
|
8
8
|
|
|
9
9
|
private readonly _updatedCalls = new Set<string>();
|
|
10
|
+
public closed = false;
|
|
10
11
|
|
|
11
12
|
public constructor(
|
|
12
13
|
private observer: Observer
|
|
@@ -20,15 +21,22 @@ export class OnAllCallObserverUpdater implements Updater {
|
|
|
20
21
|
}
|
|
21
22
|
|
|
22
23
|
close(): void {
|
|
23
|
-
|
|
24
|
+
if (this.closed) return;
|
|
25
|
+
this.closed = true;
|
|
26
|
+
|
|
27
|
+
this._updatedCalls.clear();
|
|
24
28
|
}
|
|
25
29
|
|
|
26
30
|
private _onNewObservedCall(observedCall: ObservedCall) {
|
|
31
|
+
if (this.closed) return;
|
|
32
|
+
|
|
27
33
|
const onUpdate = () => this._onObservedCallUpdated(observedCall);
|
|
28
34
|
|
|
29
35
|
observedCall.once('close', () => {
|
|
30
36
|
observedCall.off('update', onUpdate);
|
|
31
37
|
this._updatedCalls.delete(observedCall.callId);
|
|
38
|
+
|
|
39
|
+
this._updateIfEveryCallUpdated();
|
|
32
40
|
});
|
|
33
41
|
observedCall.on('update', onUpdate);
|
|
34
42
|
}
|
|
@@ -38,7 +46,12 @@ export class OnAllCallObserverUpdater implements Updater {
|
|
|
38
46
|
|
|
39
47
|
this._updatedCalls.add(observedCall.callId);
|
|
40
48
|
|
|
49
|
+
this._updateIfEveryCallUpdated();
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
private _updateIfEveryCallUpdated() {
|
|
41
53
|
if (this._updatedCalls.size < this.observer.observedCalls.size) return;
|
|
54
|
+
else if (this.closed) return;
|
|
42
55
|
|
|
43
56
|
this._updatedCalls.clear();
|
|
44
57
|
this.observer.update();
|
|
@@ -7,6 +7,7 @@ export class OnAllClientCallUpdater implements Updater {
|
|
|
7
7
|
readonly description = 'Call the update() method of the ObservedCall once all client has been updated';
|
|
8
8
|
|
|
9
9
|
private readonly _updatedClients = new Set<string>();
|
|
10
|
+
public closed = false;
|
|
10
11
|
|
|
11
12
|
public constructor(
|
|
12
13
|
private _observedCall: ObservedCall
|
|
@@ -20,25 +21,39 @@ export class OnAllClientCallUpdater implements Updater {
|
|
|
20
21
|
}
|
|
21
22
|
|
|
22
23
|
public close(): void {
|
|
24
|
+
if (this.closed) return;
|
|
25
|
+
this.closed = true;
|
|
23
26
|
// do nothing, as close once emitted unsubscription happened
|
|
27
|
+
this._updatedClients.clear();
|
|
24
28
|
}
|
|
25
29
|
|
|
26
30
|
private _onNewObservedClient(observedClient: ObservedClient) {
|
|
31
|
+
if (this.closed) return;
|
|
32
|
+
|
|
27
33
|
const onUpdate = () => this._onClientUpdate(observedClient);
|
|
28
34
|
|
|
29
35
|
observedClient.once('close', () => {
|
|
30
36
|
observedClient.off('update', onUpdate);
|
|
31
37
|
this._updatedClients.delete(observedClient.clientId);
|
|
38
|
+
this._updateIfEveryClientUpdated();
|
|
32
39
|
});
|
|
33
40
|
observedClient.on('update', onUpdate);
|
|
34
41
|
}
|
|
35
42
|
|
|
36
43
|
private _onClientUpdate(observedClient: ObservedClient) {
|
|
44
|
+
if (observedClient.closed) return;
|
|
45
|
+
|
|
37
46
|
this._updatedClients.add(observedClient.clientId);
|
|
47
|
+
this._updateIfEveryClientUpdated();
|
|
48
|
+
}
|
|
38
49
|
|
|
50
|
+
private _updateIfEveryClientUpdated() {
|
|
39
51
|
if (this._updatedClients.size < this._observedCall.observedClients.size) {
|
|
40
52
|
return;
|
|
53
|
+
} else if (this.closed) {
|
|
54
|
+
return;
|
|
41
55
|
}
|
|
56
|
+
|
|
42
57
|
this._updatedClients.clear();
|
|
43
58
|
this._observedCall.update();
|
|
44
59
|
}
|
|
@@ -5,7 +5,8 @@ import { Updater } from './Updater';
|
|
|
5
5
|
export class OnAnyCallObserverUpdater implements Updater {
|
|
6
6
|
public readonly name = 'OnAnyCallObserverUpdater';
|
|
7
7
|
public readonly description = 'Call Observer\'s update() method on any of the ObservedCall is updated';
|
|
8
|
-
|
|
8
|
+
public closed = false;
|
|
9
|
+
|
|
9
10
|
public constructor(
|
|
10
11
|
private observver: Observer
|
|
11
12
|
) {
|
|
@@ -17,12 +18,20 @@ export class OnAnyCallObserverUpdater implements Updater {
|
|
|
17
18
|
this.observver.on('newcall', this._onNewObservedCall);
|
|
18
19
|
}
|
|
19
20
|
|
|
20
|
-
close(): void {
|
|
21
|
+
public close(): void {
|
|
22
|
+
if (this.closed) return;
|
|
23
|
+
this.closed = true;
|
|
21
24
|
// do nothing, because we unsubscribe once close is emitted from observer
|
|
22
25
|
}
|
|
23
26
|
|
|
24
27
|
private _onNewObservedCall(observedCall: ObservedCall) {
|
|
25
|
-
|
|
28
|
+
if (this.closed) return;
|
|
29
|
+
|
|
30
|
+
const onUpdate = () => {
|
|
31
|
+
if (this.closed) return;
|
|
32
|
+
|
|
33
|
+
this.observver.update();
|
|
34
|
+
};
|
|
26
35
|
|
|
27
36
|
observedCall.once('close', () => {
|
|
28
37
|
observedCall.off('update', onUpdate);
|
|
@@ -5,6 +5,7 @@ import { Updater } from './Updater';
|
|
|
5
5
|
export class OnAnyClientCallUpdater implements Updater {
|
|
6
6
|
readonly name = 'OnAnyClientCallUpdater';
|
|
7
7
|
readonly description = 'Call the update() method of the ObservedCall when any of the client has been updated';
|
|
8
|
+
public closed = false;
|
|
8
9
|
|
|
9
10
|
public constructor(
|
|
10
11
|
private _observedCall: ObservedCall
|
|
@@ -18,11 +19,17 @@ export class OnAnyClientCallUpdater implements Updater {
|
|
|
18
19
|
}
|
|
19
20
|
|
|
20
21
|
public close(): void {
|
|
21
|
-
|
|
22
|
+
if (this.closed) return;
|
|
23
|
+
this.closed = true;
|
|
22
24
|
}
|
|
23
25
|
|
|
24
26
|
private _onNewObservedClient(observedClient: ObservedClient) {
|
|
25
|
-
|
|
27
|
+
if (this.closed) return;
|
|
28
|
+
|
|
29
|
+
const onUpdate = () => {
|
|
30
|
+
if (this.closed) return;
|
|
31
|
+
this._observedCall.update();
|
|
32
|
+
};
|
|
26
33
|
|
|
27
34
|
observedClient.once('close', () => {
|
|
28
35
|
observedClient.off('update', onUpdate);
|