@observertc/observer-js 1.0.1-c3edea3.0 → 1.0.1-c665f5a.0

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