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

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