@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.
Files changed (166) hide show
  1. package/README.md +535 -1
  2. package/lib/ObservedCall.d.ts +8 -7
  3. package/lib/ObservedCall.d.ts.map +1 -1
  4. package/lib/ObservedCall.js +42 -38
  5. package/lib/ObservedCallEventMonitor.d.ts +104 -0
  6. package/lib/ObservedCallEventMonitor.d.ts.map +1 -0
  7. package/lib/ObservedCallEventMonitor.js +314 -0
  8. package/lib/ObservedClient.d.ts +20 -10
  9. package/lib/ObservedClient.d.ts.map +1 -1
  10. package/lib/ObservedClient.js +330 -13
  11. package/lib/ObservedClientEventMonitor.d.ts +91 -0
  12. package/lib/ObservedClientEventMonitor.d.ts.map +1 -0
  13. package/lib/ObservedClientEventMonitor.js +254 -0
  14. package/lib/ObservedTURN.d.ts +1 -1
  15. package/lib/ObservedTURN.d.ts.map +1 -1
  16. package/lib/ObservedTURN.js +1 -0
  17. package/lib/ObservedTurnServer.d.ts +2 -2
  18. package/lib/ObservedTurnServer.d.ts.map +1 -1
  19. package/lib/Observer.d.ts +9 -6
  20. package/lib/Observer.d.ts.map +1 -1
  21. package/lib/Observer.js +26 -25
  22. package/lib/ObserverEventMonitor.d.ts +138 -0
  23. package/lib/ObserverEventMonitor.d.ts.map +1 -0
  24. package/lib/ObserverEventMonitor.js +433 -0
  25. package/lib/common/ObserverSummary.d.ts.map +1 -0
  26. package/lib/common/SummaryTypes.d.ts +75 -0
  27. package/lib/common/SummaryTypes.d.ts.map +1 -0
  28. package/lib/common/SummaryTypes.js +2 -0
  29. package/lib/index.d.ts +19 -17
  30. package/lib/index.d.ts.map +1 -1
  31. package/lib/index.js +21 -17
  32. package/lib/mediasoup/ObservedMediasoupRouter.d.ts +7 -0
  33. package/lib/mediasoup/ObservedMediasoupRouter.d.ts.map +1 -0
  34. package/lib/mediasoup/ObservedMediasoupRouter.js +12 -0
  35. package/lib/monitors/SummaryMonitor.d.ts +19 -0
  36. package/lib/monitors/SummaryMonitor.d.ts.map +1 -0
  37. package/lib/monitors/SummaryMonitor.js +129 -0
  38. package/lib/schema/ClientEventTypes.d.ts +147 -19
  39. package/lib/schema/ClientEventTypes.d.ts.map +1 -1
  40. package/lib/schema/ClientEventTypes.js +5 -2
  41. package/lib/schema/ClientSample.d.ts +1 -1
  42. package/lib/schema/ClientSample.d.ts.map +1 -1
  43. package/lib/updaters/{OnAllCallObserverUpdater_.d.ts → OnAllCallObserverUpdater.d.ts} +3 -1
  44. package/lib/updaters/OnAllCallObserverUpdater.d.ts.map +1 -0
  45. package/lib/updaters/{OnAllCallObserverUpdater_.js → OnAllCallObserverUpdater.js} +13 -1
  46. package/lib/updaters/OnAllClientCallUpdater.d.ts +2 -0
  47. package/lib/updaters/OnAllClientCallUpdater.d.ts.map +1 -1
  48. package/lib/updaters/OnAllClientCallUpdater.js +16 -0
  49. package/lib/updaters/{OnAnyCallObserverUpdater_.d.ts → OnAnyCallObserverUpdater.d.ts} +2 -1
  50. package/lib/updaters/OnAnyCallObserverUpdater.d.ts.map +1 -0
  51. package/lib/updaters/{OnAnyCallObserverUpdater_.js → OnAnyCallObserverUpdater.js} +11 -1
  52. package/lib/updaters/OnAnyClientCallUpdater.d.ts +1 -0
  53. package/lib/updaters/OnAnyClientCallUpdater.d.ts.map +1 -1
  54. package/lib/updaters/OnAnyClientCallUpdater.js +11 -2
  55. package/lib/utils/MediasoupRemoteTrackResolver.d.ts +25 -0
  56. package/lib/utils/MediasoupRemoteTrackResolver.d.ts.map +1 -0
  57. package/lib/utils/MediasoupRemoteTrackResolver.js +110 -0
  58. package/lib/utils/RemoteTrackResolver.d.ts +2 -2
  59. package/lib/utils/RemoteTrackResolver.d.ts.map +1 -1
  60. package/lib/{ObservedCertificate.d.ts → webrtc/ObservedCertificate.d.ts} +1 -1
  61. package/lib/webrtc/ObservedCertificate.d.ts.map +1 -0
  62. package/lib/{ObservedCodec.d.ts → webrtc/ObservedCodec.d.ts} +1 -1
  63. package/lib/webrtc/ObservedCodec.d.ts.map +1 -0
  64. package/lib/{ObservedDataChannel.d.ts → webrtc/ObservedDataChannel.d.ts} +3 -1
  65. package/lib/webrtc/ObservedDataChannel.d.ts.map +1 -0
  66. package/lib/{ObservedDataChannel.js → webrtc/ObservedDataChannel.js} +2 -0
  67. package/lib/{ObservedIceCandidate.d.ts → webrtc/ObservedIceCandidate.d.ts} +1 -1
  68. package/lib/webrtc/ObservedIceCandidate.d.ts.map +1 -0
  69. package/lib/{ObservedIceCandidatePair.d.ts → webrtc/ObservedIceCandidatePair.d.ts} +3 -2
  70. package/lib/webrtc/ObservedIceCandidatePair.d.ts.map +1 -0
  71. package/lib/{ObservedIceCandidatePair.js → webrtc/ObservedIceCandidatePair.js} +17 -1
  72. package/lib/{ObservedIceTransport.d.ts → webrtc/ObservedIceTransport.d.ts} +1 -1
  73. package/lib/webrtc/ObservedIceTransport.d.ts.map +1 -0
  74. package/lib/{ObservedInboundRtp.d.ts → webrtc/ObservedInboundRtp.d.ts} +2 -2
  75. package/lib/webrtc/ObservedInboundRtp.d.ts.map +1 -0
  76. package/lib/{ObservedInboundTrack.d.ts → webrtc/ObservedInboundTrack.d.ts} +7 -4
  77. package/lib/webrtc/ObservedInboundTrack.d.ts.map +1 -0
  78. package/lib/{ObservedInboundTrack.js → webrtc/ObservedInboundTrack.js} +4 -1
  79. package/lib/{ObservedMediaPlayout.d.ts → webrtc/ObservedMediaPlayout.d.ts} +2 -2
  80. package/lib/webrtc/ObservedMediaPlayout.d.ts.map +1 -0
  81. package/lib/{ObservedMediaSource.d.ts → webrtc/ObservedMediaSource.d.ts} +2 -2
  82. package/lib/webrtc/ObservedMediaSource.d.ts.map +1 -0
  83. package/lib/{ObservedOutboundRtp.d.ts → webrtc/ObservedOutboundRtp.d.ts} +2 -2
  84. package/lib/webrtc/ObservedOutboundRtp.d.ts.map +1 -0
  85. package/lib/{ObservedOutboundTrack.d.ts → webrtc/ObservedOutboundTrack.d.ts} +7 -4
  86. package/lib/webrtc/ObservedOutboundTrack.d.ts.map +1 -0
  87. package/lib/{ObservedOutboundTrack.js → webrtc/ObservedOutboundTrack.js} +4 -1
  88. package/lib/{ObservedPeerConnection.d.ts → webrtc/ObservedPeerConnection.d.ts} +26 -4
  89. package/lib/webrtc/ObservedPeerConnection.d.ts.map +1 -0
  90. package/lib/{ObservedPeerConnection.js → webrtc/ObservedPeerConnection.js} +82 -17
  91. package/lib/{ObservedPeerConnectionTransport.d.ts → webrtc/ObservedPeerConnectionTransport.d.ts} +1 -1
  92. package/lib/webrtc/ObservedPeerConnectionTransport.d.ts.map +1 -0
  93. package/lib/{ObservedRemoteInboundRtp.d.ts → webrtc/ObservedRemoteInboundRtp.d.ts} +2 -2
  94. package/lib/webrtc/ObservedRemoteInboundRtp.d.ts.map +1 -0
  95. package/lib/{ObservedRemoteOutboundRtp.d.ts → webrtc/ObservedRemoteOutboundRtp.d.ts} +2 -2
  96. package/lib/webrtc/ObservedRemoteOutboundRtp.d.ts.map +1 -0
  97. package/package.json +1 -1
  98. package/src/ObservedCall.ts +44 -48
  99. package/src/ObservedCallEventMonitor.ts +392 -0
  100. package/src/ObservedClient.ts +363 -22
  101. package/src/ObservedClientEventMonitor.ts +309 -0
  102. package/src/ObservedTURN.ts +2 -1
  103. package/src/ObservedTurnServer.ts +2 -2
  104. package/src/Observer.ts +37 -33
  105. package/src/ObserverEventMonitor.ts +551 -0
  106. package/src/common/SummaryTypes.ts +91 -0
  107. package/src/index.ts +19 -18
  108. package/src/mediasoup/ObservedMediasoupRouter.ts +12 -0
  109. package/src/monitors/SummaryMonitor.ts +181 -0
  110. package/src/schema/ClientEventTypes.ts +187 -19
  111. package/src/schema/ClientSample.ts +1 -1
  112. package/src/updaters/{OnAllCallObserverUpdater_.ts → OnAllCallObserverUpdater.ts} +14 -1
  113. package/src/updaters/OnAllClientCallUpdater.ts +15 -0
  114. package/src/updaters/{OnAnyCallObserverUpdater_.ts → OnAnyCallObserverUpdater.ts} +12 -3
  115. package/src/updaters/OnAnyClientCallUpdater.ts +9 -2
  116. package/src/utils/MediasoupRemoteTrackResolver.ts +155 -0
  117. package/src/utils/RemoteTrackResolver.ts +2 -2
  118. package/src/{ObservedCertificate.ts → webrtc/ObservedCertificate.ts} +1 -1
  119. package/src/{ObservedCodec.ts → webrtc/ObservedCodec.ts} +1 -1
  120. package/src/{ObservedDataChannel.ts → webrtc/ObservedDataChannel.ts} +4 -1
  121. package/src/{ObservedIceCandidate.ts → webrtc/ObservedIceCandidate.ts} +1 -1
  122. package/src/{ObservedIceCandidatePair.ts → webrtc/ObservedIceCandidatePair.ts} +19 -3
  123. package/src/{ObservedIceTransport.ts → webrtc/ObservedIceTransport.ts} +1 -1
  124. package/src/{ObservedInboundRtp.ts → webrtc/ObservedInboundRtp.ts} +2 -2
  125. package/src/{ObservedInboundTrack.ts → webrtc/ObservedInboundTrack.ts} +9 -4
  126. package/src/{ObservedMediaPlayout.ts → webrtc/ObservedMediaPlayout.ts} +2 -2
  127. package/src/{ObservedMediaSource.ts → webrtc/ObservedMediaSource.ts} +2 -2
  128. package/src/{ObservedOutboundRtp.ts → webrtc/ObservedOutboundRtp.ts} +2 -2
  129. package/src/{ObservedOutboundTrack.ts → webrtc/ObservedOutboundTrack.ts} +9 -4
  130. package/src/{ObservedPeerConnection.ts → webrtc/ObservedPeerConnection.ts} +124 -37
  131. package/src/{ObservedPeerConnectionTransport.ts → webrtc/ObservedPeerConnectionTransport.ts} +1 -1
  132. package/src/{ObservedRemoteInboundRtp.ts → webrtc/ObservedRemoteInboundRtp.ts} +2 -2
  133. package/src/{ObservedRemoteOutboundRtp.ts → webrtc/ObservedRemoteOutboundRtp.ts} +2 -2
  134. package/lib/ObservedCertificate.d.ts.map +0 -1
  135. package/lib/ObservedCodec.d.ts.map +0 -1
  136. package/lib/ObservedDataChannel.d.ts.map +0 -1
  137. package/lib/ObservedIceCandidate.d.ts.map +0 -1
  138. package/lib/ObservedIceCandidatePair.d.ts.map +0 -1
  139. package/lib/ObservedIceTransport.d.ts.map +0 -1
  140. package/lib/ObservedInboundRtp.d.ts.map +0 -1
  141. package/lib/ObservedInboundTrack.d.ts.map +0 -1
  142. package/lib/ObservedMediaPlayout.d.ts.map +0 -1
  143. package/lib/ObservedMediaSource.d.ts.map +0 -1
  144. package/lib/ObservedOutboundRtp.d.ts.map +0 -1
  145. package/lib/ObservedOutboundTrack.d.ts.map +0 -1
  146. package/lib/ObservedPeerConnection.d.ts.map +0 -1
  147. package/lib/ObservedPeerConnectionTransport.d.ts.map +0 -1
  148. package/lib/ObservedRemoteInboundRtp.d.ts.map +0 -1
  149. package/lib/ObservedRemoteOutboundRtp.d.ts.map +0 -1
  150. package/lib/ObserverSummary.d.ts.map +0 -1
  151. package/lib/updaters/OnAllCallObserverUpdater_.d.ts.map +0 -1
  152. package/lib/updaters/OnAnyCallObserverUpdater_.d.ts.map +0 -1
  153. /package/lib/{ObserverSummary.d.ts → common/ObserverSummary.d.ts} +0 -0
  154. /package/lib/{ObserverSummary.js → common/ObserverSummary.js} +0 -0
  155. /package/lib/{ObservedCertificate.js → webrtc/ObservedCertificate.js} +0 -0
  156. /package/lib/{ObservedCodec.js → webrtc/ObservedCodec.js} +0 -0
  157. /package/lib/{ObservedIceCandidate.js → webrtc/ObservedIceCandidate.js} +0 -0
  158. /package/lib/{ObservedIceTransport.js → webrtc/ObservedIceTransport.js} +0 -0
  159. /package/lib/{ObservedInboundRtp.js → webrtc/ObservedInboundRtp.js} +0 -0
  160. /package/lib/{ObservedMediaPlayout.js → webrtc/ObservedMediaPlayout.js} +0 -0
  161. /package/lib/{ObservedMediaSource.js → webrtc/ObservedMediaSource.js} +0 -0
  162. /package/lib/{ObservedOutboundRtp.js → webrtc/ObservedOutboundRtp.js} +0 -0
  163. /package/lib/{ObservedPeerConnectionTransport.js → webrtc/ObservedPeerConnectionTransport.js} +0 -0
  164. /package/lib/{ObservedRemoteInboundRtp.js → webrtc/ObservedRemoteInboundRtp.js} +0 -0
  165. /package/lib/{ObservedRemoteOutboundRtp.js → webrtc/ObservedRemoteOutboundRtp.js} +0 -0
  166. /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: string;
41
- iceGatheringState: string;
42
- signalingState: string;
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: string;
48
- iceGatheringState: string;
49
- signalingState: string;
59
+ iceConnectionState?: string;
60
+ iceGatheringState?: string;
61
+ signalingState?: string;
50
62
  }
51
63
 
52
- export interface MediaTrackMutedEventPayload extends Record<string, unknown> {
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 MediaTrackUnmutedEventPayload extends Record<string, unknown> {
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 MediaTrackAddedEventPayload extends Record<string, unknown> {
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 MediaTrackRemovedEventPayload extends Record<string, unknown> {
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' | 'inProgress' | 'failed' | 'succeeded';
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
- // do nothing, because we unsubscribe once close is emitted from observer
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
- const onUpdate = () => this.observver.update();
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
- // do nothing, as close once emitted unsubscription happened
22
+ if (this.closed) return;
23
+ this.closed = true;
22
24
  }
23
25
 
24
26
  private _onNewObservedClient(observedClient: ObservedClient) {
25
- const onUpdate = () => this._observedCall.update();
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);