@observertc/observer-js 1.0.1-72a904d.0 → 1.0.1-9341fcd.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 (83) hide show
  1. package/lib/ObservedCall.d.ts +4 -8
  2. package/lib/ObservedCall.d.ts.map +1 -1
  3. package/lib/ObservedCall.js +16 -72
  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/ObservedClient.d.ts +16 -8
  8. package/lib/ObservedClient.d.ts.map +1 -1
  9. package/lib/ObservedClient.js +257 -99
  10. package/lib/ObservedClientEventMonitor.d.ts +89 -0
  11. package/lib/ObservedClientEventMonitor.d.ts.map +1 -0
  12. package/lib/ObservedClientEventMonitor.js +247 -0
  13. package/lib/ObservedDataChannel.d.ts +2 -0
  14. package/lib/ObservedDataChannel.d.ts.map +1 -1
  15. package/lib/ObservedDataChannel.js +2 -0
  16. package/lib/ObservedIceCandidatePair.d.ts +2 -1
  17. package/lib/ObservedIceCandidatePair.d.ts.map +1 -1
  18. package/lib/ObservedIceCandidatePair.js +17 -1
  19. package/lib/ObservedInboundTrack.d.ts +2 -0
  20. package/lib/ObservedInboundTrack.d.ts.map +1 -1
  21. package/lib/ObservedInboundTrack.js +2 -0
  22. package/lib/ObservedOutboundTrack.d.ts +2 -0
  23. package/lib/ObservedOutboundTrack.d.ts.map +1 -1
  24. package/lib/ObservedOutboundTrack.js +2 -0
  25. package/lib/ObservedPeerConnection.d.ts.map +1 -1
  26. package/lib/ObservedPeerConnection.js +22 -6
  27. package/lib/Observer.d.ts +9 -7
  28. package/lib/Observer.d.ts.map +1 -1
  29. package/lib/Observer.js +16 -22
  30. package/lib/ObserverEventMonitor.d.ts +106 -0
  31. package/lib/ObserverEventMonitor.d.ts.map +1 -0
  32. package/lib/ObserverEventMonitor.js +320 -0
  33. package/lib/ObserverSummary.d.ts +2 -0
  34. package/lib/ObserverSummary.d.ts.map +1 -1
  35. package/lib/common/utils.d.ts +1 -0
  36. package/lib/common/utils.d.ts.map +1 -1
  37. package/lib/common/utils.js +7 -1
  38. package/lib/index.d.ts +2 -0
  39. package/lib/index.d.ts.map +1 -1
  40. package/lib/index.js +5 -1
  41. package/lib/schema/ClientEventTypes.d.ts +60 -0
  42. package/lib/schema/ClientEventTypes.d.ts.map +1 -1
  43. package/lib/schema/ClientSample.d.ts +1 -1
  44. package/lib/schema/ClientSample.d.ts.map +1 -1
  45. package/lib/updaters/{OnAllCallObserverUpdater_.d.ts → OnAllCallObserverUpdater.d.ts} +3 -1
  46. package/lib/updaters/OnAllCallObserverUpdater.d.ts.map +1 -0
  47. package/lib/updaters/{OnAllCallObserverUpdater_.js → OnAllCallObserverUpdater.js} +13 -1
  48. package/lib/updaters/OnAllClientCallUpdater.d.ts +2 -0
  49. package/lib/updaters/OnAllClientCallUpdater.d.ts.map +1 -1
  50. package/lib/updaters/OnAllClientCallUpdater.js +16 -0
  51. package/lib/updaters/{OnAnyCallObserverUpdater_.d.ts → OnAnyCallObserverUpdater.d.ts} +2 -1
  52. package/lib/updaters/OnAnyCallObserverUpdater.d.ts.map +1 -0
  53. package/lib/updaters/{OnAnyCallObserverUpdater_.js → OnAnyCallObserverUpdater.js} +11 -1
  54. package/lib/updaters/OnAnyClientCallUpdater.d.ts +1 -0
  55. package/lib/updaters/OnAnyClientCallUpdater.d.ts.map +1 -1
  56. package/lib/updaters/OnAnyClientCallUpdater.js +11 -2
  57. package/lib/utils/MediasoupRemoteTrackResolver.d.ts +25 -0
  58. package/lib/utils/MediasoupRemoteTrackResolver.d.ts.map +1 -0
  59. package/lib/utils/MediasoupRemoteTrackResolver.js +110 -0
  60. package/package.json +1 -1
  61. package/src/ObservedCall.ts +56 -82
  62. package/src/ObservedCallEventMonitor.ts +392 -0
  63. package/src/ObservedClient.ts +335 -114
  64. package/src/ObservedClientEventMonitor.ts +301 -0
  65. package/src/ObservedDataChannel.ts +3 -0
  66. package/src/ObservedIceCandidatePair.ts +18 -2
  67. package/src/ObservedInboundTrack.ts +3 -0
  68. package/src/ObservedOutboundTrack.ts +3 -0
  69. package/src/ObservedPeerConnection.ts +25 -10
  70. package/src/Observer.ts +47 -29
  71. package/src/ObserverEventMonitor.ts +398 -0
  72. package/src/ObserverSummary.ts +3 -1
  73. package/src/common/utils.ts +6 -0
  74. package/src/index.ts +2 -0
  75. package/src/schema/ClientEventTypes.ts +64 -0
  76. package/src/schema/ClientSample.ts +1 -1
  77. package/src/updaters/{OnAllCallObserverUpdater_.ts → OnAllCallObserverUpdater.ts} +14 -1
  78. package/src/updaters/OnAllClientCallUpdater.ts +15 -0
  79. package/src/updaters/{OnAnyCallObserverUpdater_.ts → OnAnyCallObserverUpdater.ts} +11 -2
  80. package/src/updaters/OnAnyClientCallUpdater.ts +9 -2
  81. package/src/utils/MediasoupRemoteTrackResolver.ts +155 -0
  82. package/lib/updaters/OnAllCallObserverUpdater_.d.ts.map +0 -1
  83. package/lib/updaters/OnAnyCallObserverUpdater_.d.ts.map +0 -1
@@ -9,8 +9,8 @@ import { RemoteTrackResolver } from './utils/RemoteTrackResolver';
9
9
  import { OnAllClientCallUpdater } from './updaters/OnAllClientCallUpdater';
10
10
  import { Updater } from './updaters/Updater';
11
11
  import { OnIntervalUpdater } from './updaters/OnIntervalUpdater';
12
- import { ObservedCallSummary } from './ObservedCallSummary';
13
12
  import { OnAnyClientCallUpdater } from './updaters/OnAnyClientCallUpdater';
13
+ import { ObservedCallEventMonitor } from './ObservedCallEventMonitor';
14
14
 
15
15
  export type ObservedCallSettings<AppData extends Record<string, unknown> = Record<string, unknown>> = {
16
16
  callId: string;
@@ -26,8 +26,6 @@ export type ObservedCallEvents = {
26
26
  empty: [],
27
27
  'not-empty': [],
28
28
  close: [],
29
- started: [],
30
- ended: [],
31
29
  }
32
30
 
33
31
  export declare interface ObservedCall {
@@ -85,7 +83,8 @@ export class ObservedCall<AppData extends Record<string, unknown> = Record<strin
85
83
  public appData: AppData;
86
84
  public closed = false;
87
85
  public startedAt?: number;
88
- public ended?: number;
86
+ public endedAt?: number;
87
+ public closedAt?: number;
89
88
 
90
89
  private _callStartedEvent: {
91
90
  emitted: boolean,
@@ -153,15 +152,14 @@ export class ObservedCall<AppData extends Record<string, unknown> = Record<strin
153
152
 
154
153
  public close() {
155
154
  if (this.closed) return;
155
+ this.update(); // last update before closing
156
156
  this.closed = true;
157
157
 
158
158
  this.updater?.close();
159
159
 
160
160
  [ ...this.observedClients.values() ].forEach((client) => client.close());
161
- // make sure to emit the events
162
- this.emitCallStartedEvent();
163
- this.emitCallEndedEvent();
164
161
 
162
+ this.closedAt = Date.now();
165
163
  this.emit('close');
166
164
  }
167
165
 
@@ -190,7 +188,7 @@ export class ObservedCall<AppData extends Record<string, unknown> = Record<strin
190
188
  if (this.observedClients.size === 0) {
191
189
  this.emit('empty');
192
190
  }
193
- --this.totalRemovedClients;
191
+ ++this.totalRemovedClients;
194
192
  });
195
193
  result.on('update', onUpdate);
196
194
  result.on('joined', joined);
@@ -209,6 +207,10 @@ export class ObservedCall<AppData extends Record<string, unknown> = Record<strin
209
207
  return result;
210
208
  }
211
209
 
210
+ public createEventMonitor<CTX>(context: CTX): ObservedCallEventMonitor<CTX> {
211
+ return new ObservedCallEventMonitor(this, context);
212
+ }
213
+
212
214
  public update() {
213
215
  if (this.closed) return;
214
216
 
@@ -222,10 +224,6 @@ export class ObservedCall<AppData extends Record<string, unknown> = Record<strin
222
224
  this.numberOfOutboundRtpStreams += client.numberOfOutboundRtpStreams;
223
225
  this.numberOfPeerConnections += client.numberOfPeerConnections;
224
226
  this.numberOfDataChannels += client.numberOfDataChannels;
225
-
226
- if (client.usingTURN) {
227
- this.clientsUsedTurn.add(client.clientId);
228
- }
229
227
  }
230
228
 
231
229
  this.detectors.update();
@@ -242,12 +240,12 @@ export class ObservedCall<AppData extends Record<string, unknown> = Record<strin
242
240
 
243
241
  private _onClientUpdate(client: ObservedClient) {
244
242
  this.totalClientsReceivedAudioBytes += client.deltaReceivedAudioBytes;
245
- this.totalClientsSentAudioBytes += client.deltaSentAudioBytes;
246
243
  this.totalClientsReceivedVideoBytes += client.deltaReceivedVideoBytes;
247
- this.totalClientsReceivedVideoBytes += client.deltaSentVideoBytes;
248
244
  this.totalClientsReceivedDataChannelBytes += client.deltaDataChannelBytesReceived;
249
- this.totalClientsSentDataChannelBytes += client.deltaDataChannelBytesSent;
250
245
  this.totalClientsReceivedBytes += client.deltaTransportReceivedBytes;
246
+ this.totalClientsSentAudioBytes += client.deltaSentAudioBytes;
247
+ this.totalClientsSentVideoBytes += client.deltaSentVideoBytes;
248
+ this.totalClientsSentDataChannelBytes += client.deltaDataChannelBytesSent;
251
249
  this.totalClientsSentBytes += client.deltaTransportSentBytes;
252
250
 
253
251
  this.deltaRttLt50Measurements += client.deltaRttLt50Measurements;
@@ -262,92 +260,68 @@ export class ObservedCall<AppData extends Record<string, unknown> = Record<strin
262
260
 
263
261
  this.deltaNumberOfIssues += client.deltaNumberOfIssues;
264
262
  this.numberOfIssues += client.deltaNumberOfIssues;
263
+
264
+ if (client.usingTURN) {
265
+ this.clientsUsedTurn.add(client.clientId);
266
+ }
265
267
  }
266
268
 
267
269
  private _clientJoined(client: ObservedClient) {
268
270
  if (!client.joinedAt) return;
269
271
 
270
272
  this.startedAt = Math.min(this.startedAt ?? client.joinedAt, client.joinedAt);
271
-
272
- if (this._callStartedEvent.emitted) return;
273
- if (this._callStartedEvent.timer) {
274
- if (1 < this.observedClients.size) {
275
- this.emitCallStartedEvent();
276
- }
277
-
278
- return;
279
- }
280
- this._callStartedEvent.timer = setTimeout(() => {
281
- this.emitCallStartedEvent();
282
- }, 5000);
283
273
  }
284
274
 
285
275
  private _clientLeft(client: ObservedClient) {
286
276
  if (!client.leftAt) return;
287
277
 
288
- this.ended = Math.max(this.ended ?? client.leftAt, client.leftAt);
289
- }
290
-
291
- public emitCallStartedEvent() {
292
- if (this._callStartedEvent.emitted) return;
293
- this._callStartedEvent.emitted = true;
294
- clearTimeout(this._callStartedEvent.timer);
295
- this._callStartedEvent.timer = undefined;
296
-
297
- this.emit('started');
298
- }
299
-
300
- public emitCallEndedEvent() {
301
- if (this._callEndedEvent.emitted) return;
302
- this._callEndedEvent.emitted = true;
303
-
304
- this.emit('ended');
278
+ this.endedAt = Math.max(this.endedAt ?? client.leftAt, client.leftAt);
305
279
  }
306
280
 
307
- public resetSummaryMetrics() {
308
- this.totalAddedClients = 0;
309
- this.totalRemovedClients = 0;
281
+ // public resetSummaryMetrics() {
282
+ // this.totalAddedClients = 0;
283
+ // this.totalRemovedClients = 0;
310
284
 
311
- this.totalClientsReceivedAudioBytes = 0;
312
- this.totalClientsReceivedVideoBytes = 0;
313
- this.totalClientsReceivedBytes = 0;
285
+ // this.totalClientsReceivedAudioBytes = 0;
286
+ // this.totalClientsReceivedVideoBytes = 0;
287
+ // this.totalClientsReceivedBytes = 0;
314
288
 
315
- this.totalClientsSentAudioBytes = 0;
316
- this.totalClientsSentVideoBytes = 0;
317
- this.totalClientsSentBytes = 0;
289
+ // this.totalClientsSentAudioBytes = 0;
290
+ // this.totalClientsSentVideoBytes = 0;
291
+ // this.totalClientsSentBytes = 0;
318
292
 
319
- this.totalRttLt50Measurements = 0;
320
- this.totalRttLt150Measurements = 0;
321
- this.totalRttLt300Measurements = 0;
322
- this.totalRttGtOrEq300Measurements = 0;
293
+ // this.totalRttLt50Measurements = 0;
294
+ // this.totalRttLt150Measurements = 0;
295
+ // this.totalRttLt300Measurements = 0;
296
+ // this.totalRttGtOrEq300Measurements = 0;
323
297
 
324
- this.numberOfIssues = 0;
298
+ // this.numberOfIssues = 0;
325
299
 
326
- this.clientsUsedTurn.clear();
300
+ // this.clientsUsedTurn.clear();
327
301
 
328
- }
302
+ // }
329
303
 
330
- public createSummary(): ObservedCallSummary {
331
- return {
332
- currentActiveClients: this.observedClients.size,
333
- totalAddedClients: this.totalAddedClients,
334
- totalRemovedClients: this.totalRemovedClients,
304
+ // public createSummary(): ObservedCallSummary {
305
+ // return {
306
+ // currentActiveClients: this.observedClients.size,
307
+ // totalAddedClients: this.totalAddedClients,
308
+ // totalRemovedClients: this.totalRemovedClients,
335
309
 
336
- totalClientsReceivedAudioBytes: this.totalClientsReceivedBytes,
337
- totalClientsReceivedVideoBytes: this.totalClientsReceivedVideoBytes,
338
- totalClientsReceivedBytes: this.totalClientsReceivedBytes,
339
-
340
- totalClientsSentAudioBytes: this.totalClientsSentAudioBytes,
341
- totalClientsSentVideoBytes: this.totalClientsSentVideoBytes,
342
- totalClientsSentBytes: this.totalClientsSentBytes,
343
-
344
- totalRttLt50Measurements: this.totalRttLt50Measurements,
345
- totalRttLt150Measurements: this.totalRttLt150Measurements,
346
- totalRttLt300Measurements: this.totalRttLt300Measurements,
347
- totalRttGtOrEq300Measurements: this.totalRttGtOrEq300Measurements,
348
-
349
- numberOfIssues: this.numberOfIssues,
350
- numberOfClientsUsedTurn: this.clientsUsedTurn.size,
351
- };
352
- }
310
+ // totalClientsReceivedAudioBytes: this.totalClientsReceivedBytes,
311
+ // totalClientsReceivedVideoBytes: this.totalClientsReceivedVideoBytes,
312
+ // totalClientsReceivedBytes: this.totalClientsReceivedBytes,
313
+
314
+ // totalClientsSentAudioBytes: this.totalClientsSentAudioBytes,
315
+ // totalClientsSentVideoBytes: this.totalClientsSentVideoBytes,
316
+ // totalClientsSentBytes: this.totalClientsSentBytes,
317
+
318
+ // totalRttLt50Measurements: this.totalRttLt50Measurements,
319
+ // totalRttLt150Measurements: this.totalRttLt150Measurements,
320
+ // totalRttLt300Measurements: this.totalRttLt300Measurements,
321
+ // totalRttGtOrEq300Measurements: this.totalRttGtOrEq300Measurements,
322
+
323
+ // numberOfIssues: this.numberOfIssues,
324
+ // numberOfClientsUsedTurn: this.clientsUsedTurn.size,
325
+ // };
326
+ // }
353
327
  }
@@ -0,0 +1,392 @@
1
+ import { ObservedCall } from './ObservedCall';
2
+ import { ObservedCertificate } from './ObservedCertificate';
3
+ import { ObservedClient, ObservedClientEvents } from './ObservedClient';
4
+ import { ObservedCodec } from './ObservedCodec';
5
+ import { ObservedDataChannel } from './ObservedDataChannel';
6
+ import { ObservedIceCandidate } from './ObservedIceCandidate';
7
+ import { ObservedIceCandidatePair } from './ObservedIceCandidatePair';
8
+ import { ObservedIceTransport } from './ObservedIceTransport';
9
+ import { ObservedInboundRtp } from './ObservedInboundRtp';
10
+ import { ObservedInboundTrack } from './ObservedInboundTrack';
11
+ import { ObservedMediaPlayout } from './ObservedMediaPlayout';
12
+ import { ObservedMediaSource } from './ObservedMediaSource';
13
+ import { ObservedOutboundRtp } from './ObservedOutboundRtp';
14
+ import { ObservedOutboundTrack } from './ObservedOutboundTrack';
15
+ import { ObservedPeerConnection } from './ObservedPeerConnection';
16
+ import { ClientEvent, ClientIssue, ClientMetaData, ClientSample, ExtensionStat } from './schema/ClientSample';
17
+
18
+ export class ObservedCallEventMonitor<Context> {
19
+ public constructor(
20
+ public readonly call: ObservedCall,
21
+ public readonly context: Context,
22
+ ) {
23
+ this._onPeerConnconnectionAdded = this._onPeerConnconnectionAdded.bind(this);
24
+ this._onPeerConnectionRemoved = this._onPeerConnectionRemoved.bind(this);
25
+ this._onCertificateAdded = this._onCertificateAdded.bind(this);
26
+ this._onCertificateRemoved = this._onCertificateRemoved.bind(this);
27
+ this._onInboundTrackAdded = this._onInboundTrackAdded.bind(this);
28
+ this._onInboundTrackRemoved = this._onInboundTrackRemoved.bind(this);
29
+ this._onOutboundTrackAdded = this._onOutboundTrackAdded.bind(this);
30
+ this._onOutboundTrackRemoved = this._onOutboundTrackRemoved.bind(this);
31
+ this._onInboundRtpAdded = this._onInboundRtpAdded.bind(this);
32
+ this._onInboundRtpRemoved = this._onInboundRtpRemoved.bind(this);
33
+ this._onOutboundRtpAdded = this._onOutboundRtpAdded.bind(this);
34
+ this._onOutboundRtpRemoved = this._onOutboundRtpRemoved.bind(this);
35
+ this._onDataChannelAdded = this._onDataChannelAdded.bind(this);
36
+ this._onDataChannelRemoved = this._onDataChannelRemoved.bind(this);
37
+ this._onAddedIceTransport = this._onAddedIceTransport.bind(this);
38
+ this._onRemovedIceTransport = this._onRemovedIceTransport.bind(this);
39
+ this._onIceCandidateAdded = this._onIceCandidateAdded.bind(this);
40
+ this._onIceCandidateRemoved = this._onIceCandidateRemoved.bind(this);
41
+ this._onAddedIceCandidatePair = this._onAddedIceCandidatePair.bind(this);
42
+ this._onRemovedIceCandidatePair = this._onRemovedIceCandidatePair.bind(this);
43
+ this._onAddedMediaCodec = this._onAddedMediaCodec.bind(this);
44
+ this._onRemovedMediaCodec = this._onRemovedMediaCodec.bind(this);
45
+ this._onAddedMediaPlayout = this._onAddedMediaPlayout.bind(this);
46
+ this._onRemovedMediaPlayout = this._onRemovedMediaPlayout.bind(this);
47
+ this._onMediaSourceAdded = this._onMediaSourceAdded.bind(this);
48
+ this._onMediaSourceRemoved = this._onMediaSourceRemoved.bind(this);
49
+ this._onClientIssue = this._onClientIssue.bind(this);
50
+ this._onClientMetadata = this._onClientMetadata.bind(this);
51
+ this._onClientJoined = this._onClientJoined.bind(this);
52
+ this._onClientLeft = this._onClientLeft.bind(this);
53
+ this._onUserMediaError = this._onUserMediaError.bind(this);
54
+ this._onUsingTurn = this._onUsingTurn.bind(this);
55
+ this._onClientAdded = this._onClientAdded.bind(this);
56
+ this._onCallAdded = this._onCallAdded.bind(this);
57
+ this._onClientRejoined = this._onClientRejoined.bind(this);
58
+ this._onClientExtensionStats = this._onClientExtensionStats.bind(this);
59
+
60
+ this._onCallAdded(call);
61
+ }
62
+
63
+ // Public event handlers
64
+ public onCallClosed?: (call: ObservedCall, ctx: Context) => void;
65
+ public onCallEmpty?: (call: ObservedCall, ctx: Context) => void;
66
+ public onCallNotEmpty?: (call: ObservedCall, ctx: Context) => void;
67
+ public onCallUpdated?: (call: ObservedCall, ctx: Context) => void;
68
+
69
+ public onClientAdded?: (client: ObservedClient, ctx: Context) => void;
70
+ public onClientClosed?: (client: ObservedClient, ctx: Context) => void;
71
+ public onClientRejoined?: (client: ObservedClient, ctx: Context) => void;
72
+ public onClientIssue?: (observedClent: ObservedClient, issue: ClientIssue, ctx: Context) => void;
73
+ public onClientMetadata?: (observedClient: ObservedClient, metadata: ClientMetaData, ctx: Context) => void;
74
+ public onClientExtensionStats?: (observedClient: ObservedClient, extensionStats: ExtensionStat, ctx: Context) => void;
75
+ public onClientJoined?: (client: ObservedClient, ctx: Context) => void;
76
+ public onClientLeft?: (client: ObservedClient, ctx: Context) => void;
77
+ public onClientUserMediaError?: (observedClient: ObservedClient, error: string, ctx: Context) => void;
78
+ public onClientUsingTurn?: (client: ObservedClient, usingTurn: boolean, ctx: Context) => void;
79
+ public onClientUpdated?: (client: ObservedClient, sample: ClientSample, ctx: Context) => void;
80
+ public onClientEvent?: (client: ObservedClient, event: ClientEvent, ctx: Context) => void;
81
+
82
+ public onPeerConnectionAdded?: (peerConnection: ObservedPeerConnection, ctx: Context) => void;
83
+ public onPeerConnectionRemoved?: (peerConnection: ObservedPeerConnection, ctx: Context) => void;
84
+ public onSelectedCandidatePairChanged?: (peerConnection: ObservedPeerConnection, ctx: Context) => void;
85
+ public onIceGatheringStateChange?: (peerConnection: ObservedPeerConnection, ctx: Context) => void;
86
+ public onIceConnectionStateChange?: (peerConnection: ObservedPeerConnection, ctx: Context) => void;
87
+ public onConnectionStateChange?: (peerConnection: ObservedPeerConnection, ctx: Context) => void;
88
+
89
+ public onCertificateAdded?: (certificate: ObservedCertificate, ctx: Context) => void;
90
+ public onCertificateRemoved?: (certificate: ObservedCertificate, ctx: Context) => void;
91
+
92
+ public onInboundTrackAdded?: (inboundTrack: ObservedInboundTrack, ctx: Context) => void;
93
+ public onInboundTrackRemoved?: (inboundTrack: ObservedInboundTrack, ctx: Context) => void;
94
+
95
+ public onOutboundTrackAdded?: (outboundTrack: ObservedOutboundTrack, ctx: Context) => void;
96
+ public onOutboundTrackRemoved?: (outboundTrack: ObservedOutboundTrack, ctx: Context) => void;
97
+
98
+ public onInboundRtpAdded?: (inboundRtp: ObservedInboundRtp, ctx: Context) => void;
99
+ public onInboundRtpRemoved?: (inboundRtp: ObservedInboundRtp, ctx: Context) => void;
100
+
101
+ public onOutboundRtpAdded?: (outboundRtp: ObservedOutboundRtp, ctx: Context) => void;
102
+ public onOutboundRtpRemoved?: (outboundRtp: ObservedOutboundRtp, ctx: Context) => void;
103
+
104
+ public onDataChannelAdded?: (dataChannel: ObservedDataChannel, ctx: Context) => void;
105
+ public onDataChannelRemoved?: (dataChannel: ObservedDataChannel, ctx: Context) => void;
106
+
107
+ public onAddedIceTransport?: (iceTransport: ObservedIceTransport, ctx: Context) => void;
108
+ public onRemovedIceTransport?: (iceTransport: ObservedIceTransport, ctx: Context) => void;
109
+
110
+ public onIceCandidateAdded?: (iceCandidate: ObservedIceCandidate, ctx: Context) => void;
111
+ public onIceCandidateRemoved?: (iceCandidate: ObservedIceCandidate, ctx: Context) => void;
112
+
113
+ public onAddedIceCandidatePair?: (candidatePair: ObservedIceCandidatePair, ctx: Context) => void;
114
+ public onRemovedIceCandidatePair?: (candidatePair: ObservedIceCandidatePair, ctx: Context) => void;
115
+
116
+ public onAddedMediaCodec?: (codec: ObservedCodec, ctx: Context) => void;
117
+ public onRemovedMediaCodec?: (codec: ObservedCodec, ctx: Context) => void;
118
+
119
+ public onAddedMediaPlayout?: (mediaPlayout: ObservedMediaPlayout, ctx: Context) => void;
120
+ public onRemovedMediaPlayout?: (mediaPlayout: ObservedMediaPlayout, ctx: Context) => void;
121
+
122
+ public onMediaSourceAdded?: (mediaSource: ObservedMediaSource, ctx: Context) => void;
123
+ public onMediaSourceRemoved?: (mediaSource: ObservedMediaSource, ctx: Context) => void;
124
+
125
+ private _onCallAdded(call: ObservedCall) {
126
+ const onCallEmpty = () => this.onCallEmpty?.(call, this.context);
127
+ const onCallNotEmpty = () => this.onCallNotEmpty?.(call, this.context);
128
+ const onCallUpdated = () => this.onCallUpdated?.(call, this.context);
129
+
130
+ call.once('close', () => {
131
+ call.off('newclient', this._onClientAdded);
132
+ call.off('empty', onCallEmpty);
133
+ call.off('not-empty', onCallNotEmpty);
134
+ call.off('update', onCallUpdated);
135
+
136
+ this.onCallClosed?.(call, this.context);
137
+
138
+ });
139
+ call.on('newclient', this._onClientAdded);
140
+ call.on('empty', onCallEmpty);
141
+ call.on('not-empty', onCallNotEmpty);
142
+ call.on('update', onCallUpdated);
143
+
144
+ }
145
+
146
+ private _onClientAdded(observedClient: ObservedClient) {
147
+ const onClientIssue = (issue: ClientIssue) => this._onClientIssue(observedClient, issue);
148
+ const onClientMetadata = (metaData: ClientMetaData) => this._onClientMetadata(observedClient, metaData);
149
+ const onClientJoined = () => this._onClientJoined(observedClient);
150
+ const onClientLeft = () => this._onClientLeft(observedClient);
151
+ const onClientRejoined = () => this._onClientRejoined(observedClient);
152
+ const onClientExtensionStats = (extensionStats: ExtensionStat) => this._onClientExtensionStats(observedClient, extensionStats);
153
+ const onUsingTurn = (usingTurn: boolean) => this._onUsingTurn(observedClient, usingTurn);
154
+ const onUserMediaError = (error: string) => this._onUserMediaError(observedClient, error);
155
+ const onClientUpdated = (...args: ObservedClientEvents['update']) => this.onClientUpdated?.(observedClient, args[0].sample, this.context);
156
+ const onClientEvent = (event: ClientEvent) => this.onClientEvent?.(observedClient, event, this.context);
157
+
158
+ observedClient.once('close', () => {
159
+ observedClient.off('newpeerconnection', this._onPeerConnconnectionAdded);
160
+ observedClient.off('issue', onClientIssue);
161
+ observedClient.off('metaData', onClientMetadata);
162
+ observedClient.off('joined', onClientJoined);
163
+ observedClient.off('left', onClientLeft);
164
+ observedClient.off('rejoined', onClientJoined);
165
+ observedClient.off('usermediaerror', onUserMediaError);
166
+ observedClient.off('usingturn', onUsingTurn);
167
+ observedClient.off('update', onClientUpdated);
168
+ observedClient.off('clientEvent', onClientEvent);
169
+
170
+ this.onClientClosed?.(observedClient, this.context);
171
+ });
172
+
173
+ observedClient.on('newpeerconnection', this._onPeerConnconnectionAdded);
174
+ observedClient.on('issue', onClientIssue);
175
+ observedClient.on('metaData', onClientMetadata);
176
+ observedClient.on('joined', onClientJoined);
177
+ observedClient.on('left', onClientLeft);
178
+ observedClient.on('rejoined', onClientRejoined);
179
+ observedClient.on('usermediaerror', onUserMediaError);
180
+ observedClient.on('usingturn', onUsingTurn);
181
+ observedClient.on('extensionStats', onClientExtensionStats);
182
+ observedClient.on('update', onClientUpdated);
183
+ observedClient.on('clientEvent', onClientEvent);
184
+
185
+ this.onClientAdded?.(observedClient, this.context);
186
+ }
187
+
188
+ private _onClientRejoined(observedClient: ObservedClient) {
189
+ this.onClientRejoined?.(observedClient, this.context);
190
+ }
191
+
192
+ private _onPeerConnconnectionAdded(peerConnection: ObservedPeerConnection) {
193
+ const onSelectedCandidatePairChanged = () => this.onSelectedCandidatePairChanged?.(peerConnection, this.context);
194
+ const onIceGatheringStateChange = () => this.onIceGatheringStateChange?.(peerConnection, this.context);
195
+ const onIceConnectionStateChange = () => this.onIceConnectionStateChange?.(peerConnection, this.context);
196
+ const onConnectionStateChange = () => this.onConnectionStateChange?.(peerConnection, this.context);
197
+
198
+ peerConnection.once('close', () => {
199
+ peerConnection.off('added-certificate', this._onCertificateAdded);
200
+ peerConnection.off('removed-certificate', this._onCertificateRemoved);
201
+ peerConnection.off('added-inbound-track', this._onInboundTrackAdded);
202
+ peerConnection.off('removed-inbound-track', this._onInboundTrackRemoved);
203
+ peerConnection.off('added-outbound-track', this._onOutboundTrackAdded);
204
+ peerConnection.off('removed-outbound-track', this._onOutboundTrackRemoved);
205
+ peerConnection.off('added-inbound-rtp', this._onInboundRtpAdded);
206
+ peerConnection.off('removed-inbound-rtp', this._onInboundRtpRemoved);
207
+ peerConnection.off('added-outbound-rtp', this._onOutboundRtpAdded);
208
+ peerConnection.off('removed-outbound-rtp', this._onOutboundRtpRemoved);
209
+ peerConnection.off('added-data-channel', this._onDataChannelAdded);
210
+ peerConnection.off('removed-data-channel', this._onDataChannelRemoved);
211
+ peerConnection.off('added-ice-transport', this._onAddedIceTransport);
212
+ peerConnection.off('removed-ice-transport', this._onRemovedIceTransport);
213
+ peerConnection.off('added-ice-candidate', this._onIceCandidateAdded);
214
+ peerConnection.off('removed-ice-candidate', this._onIceCandidateRemoved);
215
+ peerConnection.off('added-ice-candidate-pair', this._onAddedIceCandidatePair);
216
+ peerConnection.off('removed-ice-candidate-pair', this._onRemovedIceCandidatePair);
217
+ peerConnection.off('added-codec', this._onAddedMediaCodec);
218
+ peerConnection.off('removed-codec', this._onRemovedMediaCodec);
219
+ peerConnection.off('added-media-playout', this._onAddedMediaPlayout);
220
+ peerConnection.off('removed-media-playout', this._onRemovedMediaPlayout);
221
+ peerConnection.off('added-media-source', this._onMediaSourceAdded);
222
+ peerConnection.off('removed-media-source', this._onMediaSourceRemoved);
223
+ peerConnection.off('selectedcandidatepair', onSelectedCandidatePairChanged);
224
+ peerConnection.off('icegatheringstatechange', onIceGatheringStateChange);
225
+ peerConnection.off('iceconnectionstatechange', onIceConnectionStateChange);
226
+ peerConnection.off('connectionstatechange', onConnectionStateChange);
227
+
228
+ this.onPeerConnectionRemoved?.(peerConnection, this.context);
229
+ });
230
+
231
+ peerConnection.on('added-certificate', this._onCertificateAdded);
232
+ peerConnection.on('removed-certificate', this._onCertificateRemoved);
233
+ peerConnection.on('added-inbound-track', this._onInboundTrackAdded);
234
+ peerConnection.on('removed-inbound-track', this._onInboundTrackRemoved);
235
+ peerConnection.on('added-outbound-track', this._onOutboundTrackAdded);
236
+ peerConnection.on('removed-outbound-track', this._onOutboundTrackRemoved);
237
+ peerConnection.on('added-inbound-rtp', this._onInboundRtpAdded);
238
+ peerConnection.on('removed-inbound-rtp', this._onInboundRtpRemoved);
239
+ peerConnection.on('added-outbound-rtp', this._onOutboundRtpAdded);
240
+ peerConnection.on('removed-outbound-rtp', this._onOutboundRtpRemoved);
241
+ peerConnection.on('added-data-channel', this._onDataChannelAdded);
242
+ peerConnection.on('removed-data-channel', this._onDataChannelRemoved);
243
+ peerConnection.on('added-ice-transport', this._onAddedIceTransport);
244
+ peerConnection.on('removed-ice-transport', this._onRemovedIceTransport);
245
+ peerConnection.on('added-ice-candidate', this._onIceCandidateAdded);
246
+ peerConnection.on('removed-ice-candidate', this._onIceCandidateRemoved);
247
+ peerConnection.on('added-ice-candidate-pair', this._onAddedIceCandidatePair);
248
+ peerConnection.on('removed-ice-candidate-pair', this._onRemovedIceCandidatePair);
249
+ peerConnection.on('added-codec', this._onAddedMediaCodec);
250
+ peerConnection.on('removed-codec', this._onRemovedMediaCodec);
251
+ peerConnection.on('added-media-playout', this._onAddedMediaPlayout);
252
+ peerConnection.on('removed-media-playout', this._onRemovedMediaPlayout);
253
+ peerConnection.on('added-media-source', this._onMediaSourceAdded);
254
+ peerConnection.on('removed-media-source', this._onMediaSourceRemoved);
255
+ peerConnection.on('selectedcandidatepair', onSelectedCandidatePairChanged);
256
+ peerConnection.on('icegatheringstatechange', onIceGatheringStateChange);
257
+ peerConnection.on('iceconnectionstatechange', onIceConnectionStateChange);
258
+ peerConnection.on('connectionstatechange', onConnectionStateChange);
259
+
260
+ this.onPeerConnectionAdded?.(peerConnection, this.context);
261
+
262
+ }
263
+
264
+ private _onPeerConnectionRemoved(peerConnection: ObservedPeerConnection) {
265
+ this.onPeerConnectionRemoved?.(peerConnection, this.context);
266
+
267
+ }
268
+
269
+ private _onCertificateAdded(certificate: ObservedCertificate) {
270
+ this.onCertificateAdded?.(certificate, this.context);
271
+ }
272
+
273
+ private _onCertificateRemoved(certificate: ObservedCertificate) {
274
+ this.onCertificateRemoved?.(certificate, this.context);
275
+ }
276
+
277
+ private _onInboundTrackAdded(inboundTrack: ObservedInboundTrack) {
278
+ this.onInboundTrackAdded?.(inboundTrack, this.context);
279
+ }
280
+
281
+ private _onInboundTrackRemoved(inboundTrack: ObservedInboundTrack) {
282
+ this.onInboundTrackRemoved?.(inboundTrack, this.context);
283
+ }
284
+
285
+ private _onOutboundTrackAdded(outboundTrack: ObservedOutboundTrack) {
286
+ this.onOutboundTrackAdded?.(outboundTrack, this.context);
287
+ }
288
+
289
+ private _onOutboundTrackRemoved(outboundTrack: ObservedOutboundTrack) {
290
+ this.onOutboundTrackRemoved?.(outboundTrack, this.context);
291
+ }
292
+
293
+ private _onInboundRtpAdded(inboundRtp: ObservedInboundRtp) {
294
+ this.onInboundRtpAdded?.(inboundRtp, this.context);
295
+ }
296
+
297
+ private _onInboundRtpRemoved(inboundRtp: ObservedInboundRtp) {
298
+ this.onInboundRtpRemoved?.(inboundRtp, this.context);
299
+ }
300
+
301
+ private _onOutboundRtpAdded(outboundRtp: ObservedOutboundRtp) {
302
+ this.onOutboundRtpAdded?.(outboundRtp, this.context);
303
+ }
304
+
305
+ private _onOutboundRtpRemoved(outboundRtp: ObservedOutboundRtp) {
306
+ this.onOutboundRtpRemoved?.(outboundRtp, this.context);
307
+ }
308
+
309
+ private _onDataChannelAdded(dataChannel: ObservedDataChannel) {
310
+ this.onDataChannelAdded?.(dataChannel, this.context);
311
+ }
312
+
313
+ private _onDataChannelRemoved(dataChannel: ObservedDataChannel) {
314
+ this.onDataChannelRemoved?.(dataChannel, this.context);
315
+ }
316
+
317
+ private _onAddedIceTransport(iceTransport: ObservedIceTransport) {
318
+ this.onAddedIceTransport?.(iceTransport, this.context);
319
+ }
320
+
321
+ private _onRemovedIceTransport(iceTransport: ObservedIceTransport) {
322
+ this.onRemovedIceTransport?.(iceTransport, this.context);
323
+ }
324
+
325
+ private _onIceCandidateAdded(iceCandidate: ObservedIceCandidate) {
326
+ this.onIceCandidateAdded?.(iceCandidate, this.context);
327
+ }
328
+
329
+ private _onIceCandidateRemoved(iceCandidate: ObservedIceCandidate) {
330
+ this.onIceCandidateRemoved?.(iceCandidate, this.context);
331
+ }
332
+
333
+ private _onAddedIceCandidatePair(candidatePair: ObservedIceCandidatePair) {
334
+ this.onAddedIceCandidatePair?.(candidatePair, this.context);
335
+ }
336
+
337
+ private _onRemovedIceCandidatePair(candidatePair: ObservedIceCandidatePair) {
338
+ this.onRemovedIceCandidatePair?.(candidatePair, this.context);
339
+ }
340
+
341
+ private _onAddedMediaCodec(codec: ObservedCodec) {
342
+ this.onAddedMediaCodec?.(codec, this.context);
343
+ }
344
+
345
+ private _onRemovedMediaCodec(codec: ObservedCodec) {
346
+ this.onRemovedMediaCodec?.(codec, this.context);
347
+ }
348
+
349
+ private _onAddedMediaPlayout(mediaPlayout: ObservedMediaPlayout) {
350
+ this.onAddedMediaPlayout?.(mediaPlayout, this.context);
351
+ }
352
+
353
+ private _onRemovedMediaPlayout(mediaPlayout: ObservedMediaPlayout) {
354
+ this.onRemovedMediaPlayout?.(mediaPlayout, this.context);
355
+ }
356
+
357
+ private _onMediaSourceAdded(mediaSource: ObservedMediaSource) {
358
+ this.onMediaSourceAdded?.(mediaSource, this.context);
359
+ }
360
+
361
+ private _onMediaSourceRemoved(mediaSource: ObservedMediaSource) {
362
+ this.onMediaSourceRemoved?.(mediaSource, this.context);
363
+ }
364
+
365
+ private _onClientIssue(observedClent: ObservedClient, issue: ClientIssue) {
366
+ this.onClientIssue?.(observedClent, issue, this.context);
367
+ }
368
+
369
+ private _onClientMetadata(observedClient: ObservedClient, metadata: ClientMetaData) {
370
+ this.onClientMetadata?.(observedClient, metadata, this.context);
371
+ }
372
+
373
+ private _onClientExtensionStats(observedClient: ObservedClient, extensionStats: ExtensionStat) {
374
+ this.onClientExtensionStats?.(observedClient, extensionStats, this.context);
375
+ }
376
+
377
+ private _onClientJoined(observedClient: ObservedClient) {
378
+ this.onClientJoined?.(observedClient, this.context);
379
+ }
380
+
381
+ private _onClientLeft(observedClient: ObservedClient) {
382
+ this.onClientLeft?.(observedClient, this.context);
383
+ }
384
+
385
+ private _onUserMediaError(observedClient: ObservedClient, error: string) {
386
+ this.onClientUserMediaError?.(observedClient, error, this.context);
387
+ }
388
+
389
+ private _onUsingTurn(observedClient: ObservedClient, usingTurn: boolean) {
390
+ this.onClientUsingTurn?.(observedClient, usingTurn, this.context);
391
+ }
392
+ }