@observertc/observer-js 1.0.1-b52220e.0 → 1.0.1-c2558cc.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 (66) hide show
  1. package/lib/ObservedCall.d.ts +2 -0
  2. package/lib/ObservedCall.d.ts.map +1 -1
  3. package/lib/ObservedCall.js +4 -0
  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 +2 -2
  8. package/lib/ObservedClient.d.ts.map +1 -1
  9. package/lib/ObservedClient.js +52 -4
  10. package/lib/ObservedIceCandidatePair.d.ts +2 -1
  11. package/lib/ObservedIceCandidatePair.d.ts.map +1 -1
  12. package/lib/ObservedIceCandidatePair.js +17 -1
  13. package/lib/ObservedInboundTrack.d.ts +1 -0
  14. package/lib/ObservedInboundTrack.d.ts.map +1 -1
  15. package/lib/ObservedInboundTrack.js +1 -0
  16. package/lib/ObservedOutboundTrack.d.ts +1 -0
  17. package/lib/ObservedOutboundTrack.d.ts.map +1 -1
  18. package/lib/ObservedOutboundTrack.js +1 -0
  19. package/lib/ObservedPeerConnection.d.ts +19 -0
  20. package/lib/ObservedPeerConnection.d.ts.map +1 -1
  21. package/lib/ObservedPeerConnection.js +75 -15
  22. package/lib/Observer.d.ts +8 -4
  23. package/lib/Observer.d.ts.map +1 -1
  24. package/lib/Observer.js +14 -2
  25. package/lib/ObserverEventMonitor.d.ts +138 -0
  26. package/lib/ObserverEventMonitor.d.ts.map +1 -0
  27. package/lib/ObserverEventMonitor.js +433 -0
  28. package/lib/index.d.ts +2 -1
  29. package/lib/index.d.ts.map +1 -1
  30. package/lib/index.js +3 -1
  31. package/lib/schema/ClientSample.d.ts +1 -1
  32. package/lib/schema/ClientSample.d.ts.map +1 -1
  33. package/lib/updaters/{OnAllCallObserverUpdater_.d.ts → OnAllCallObserverUpdater.d.ts} +3 -1
  34. package/lib/updaters/OnAllCallObserverUpdater.d.ts.map +1 -0
  35. package/lib/updaters/{OnAllCallObserverUpdater_.js → OnAllCallObserverUpdater.js} +13 -1
  36. package/lib/updaters/OnAllClientCallUpdater.d.ts +2 -0
  37. package/lib/updaters/OnAllClientCallUpdater.d.ts.map +1 -1
  38. package/lib/updaters/OnAllClientCallUpdater.js +16 -0
  39. package/lib/updaters/{OnAnyCallObserverUpdater_.d.ts → OnAnyCallObserverUpdater.d.ts} +2 -1
  40. package/lib/updaters/OnAnyCallObserverUpdater.d.ts.map +1 -0
  41. package/lib/updaters/{OnAnyCallObserverUpdater_.js → OnAnyCallObserverUpdater.js} +11 -1
  42. package/lib/updaters/OnAnyClientCallUpdater.d.ts +1 -0
  43. package/lib/updaters/OnAnyClientCallUpdater.d.ts.map +1 -1
  44. package/lib/updaters/OnAnyClientCallUpdater.js +11 -2
  45. package/lib/utils/MediasoupRemoteTrackResolver.d.ts +25 -0
  46. package/lib/utils/MediasoupRemoteTrackResolver.d.ts.map +1 -0
  47. package/lib/utils/MediasoupRemoteTrackResolver.js +110 -0
  48. package/package.json +1 -1
  49. package/src/ObservedCall.ts +5 -0
  50. package/src/ObservedCallEventMonitor.ts +392 -0
  51. package/src/ObservedClient.ts +53 -7
  52. package/src/ObservedIceCandidatePair.ts +18 -2
  53. package/src/ObservedInboundTrack.ts +2 -0
  54. package/src/ObservedOutboundTrack.ts +2 -0
  55. package/src/ObservedPeerConnection.ts +95 -30
  56. package/src/Observer.ts +21 -6
  57. package/src/ObserverEventMonitor.ts +551 -0
  58. package/src/index.ts +2 -2
  59. package/src/schema/ClientSample.ts +1 -1
  60. package/src/updaters/{OnAllCallObserverUpdater_.ts → OnAllCallObserverUpdater.ts} +14 -1
  61. package/src/updaters/OnAllClientCallUpdater.ts +15 -0
  62. package/src/updaters/{OnAnyCallObserverUpdater_.ts → OnAnyCallObserverUpdater.ts} +12 -3
  63. package/src/updaters/OnAnyClientCallUpdater.ts +9 -2
  64. package/src/utils/MediasoupRemoteTrackResolver.ts +155 -0
  65. package/lib/updaters/OnAllCallObserverUpdater_.d.ts.map +0 -1
  66. package/lib/updaters/OnAnyCallObserverUpdater_.d.ts.map +0 -1
@@ -72,6 +72,26 @@ export type ObservedPeerConnectionEvents = {
72
72
  'removed-peer-connection-transport': [ObservedPeerConnectionTransport];
73
73
  'removed-remote-inbound-rtp': [ObservedRemoteInboundRtp];
74
74
  'removed-remote-outbound-rtp': [ObservedRemoteOutboundRtp];
75
+ 'updated-inbound-rtp': [ObservedInboundRtp];
76
+ 'updated-outbound-rtp': [ObservedOutboundRtp];
77
+ 'updated-inbound-track': [ObservedInboundTrack];
78
+ 'updated-outbound-track': [ObservedOutboundTrack];
79
+ 'updated-ice-candidate-pair': [ObservedIceCandidatePair];
80
+ 'updated-ice-transport': [ObservedIceTransport];
81
+ 'updated-peer-connection-transport': [ObservedPeerConnectionTransport];
82
+ 'updated-media-source': [ObservedMediaSource];
83
+ 'updated-media-playout': [ObservedMediaPlayout];
84
+ 'updated-data-channel': [ObservedDataChannel];
85
+ 'updated-ice-candidate': [ObservedIceCandidate];
86
+ 'updated-certificate': [ObservedCertificate];
87
+ 'updated-codec': [ObservedCodec];
88
+ 'updated-remote-inbound-rtp': [ObservedRemoteInboundRtp];
89
+ 'updated-remote-outbound-rtp': [ObservedRemoteOutboundRtp];
90
+ 'muted-inbound-track': [ObservedInboundTrack];
91
+ 'muted-outbound-track': [ObservedOutboundTrack];
92
+ 'unmuted-inbound-track': [ObservedInboundTrack];
93
+ 'unmuted-outbound-track': [ObservedOutboundTrack];
94
+
75
95
  'update': [],
76
96
  close: [];
77
97
  };
@@ -644,12 +664,15 @@ export class ObservedPeerConnection extends EventEmitter {
644
664
 
645
665
  observedCertificate = new ObservedCertificate(stats.timestamp, stats.id, this);
646
666
 
667
+ observedCertificate.update(stats);
668
+
647
669
  this.observedCertificates.set(stats.id, observedCertificate);
648
670
  this.emit('added-certificate', observedCertificate);
671
+ } else {
672
+ observedCertificate.update(stats);
673
+ this.emit('updated-certificate', observedCertificate);
649
674
  }
650
675
 
651
- observedCertificate.update(stats);
652
-
653
676
  return observedCertificate;
654
677
  }
655
678
 
@@ -666,11 +689,14 @@ export class ObservedPeerConnection extends EventEmitter {
666
689
 
667
690
  observedCodec = new ObservedCodec(stats.timestamp, stats.id, stats.mimeType, this);
668
691
 
692
+ observedCodec.update(stats);
693
+
669
694
  this.observedCodecs.set(stats.id, observedCodec);
670
695
  this.emit('added-codec', observedCodec);
696
+ } else {
697
+ observedCodec.update(stats);
671
698
  }
672
-
673
- observedCodec.update(stats);
699
+ this.emit('updated-codec', observedCodec);
674
700
 
675
701
  return observedCodec;
676
702
  }
@@ -688,11 +714,14 @@ export class ObservedPeerConnection extends EventEmitter {
688
714
 
689
715
  observedDataChannel = new ObservedDataChannel(stats.timestamp, stats.id, this);
690
716
 
717
+ observedDataChannel.update(stats);
718
+
691
719
  this.observedDataChannels.set(stats.id, observedDataChannel);
692
720
  this.emit('added-data-channel', observedDataChannel);
721
+ } else {
722
+ observedDataChannel.update(stats);
693
723
  }
694
-
695
- observedDataChannel.update(stats);
724
+ this.emit('updated-data-channel', observedDataChannel);
696
725
 
697
726
  return observedDataChannel;
698
727
  }
@@ -710,11 +739,14 @@ export class ObservedPeerConnection extends EventEmitter {
710
739
 
711
740
  observedIceCandidate = new ObservedIceCandidate(stats.timestamp, stats.id, this);
712
741
 
742
+ observedIceCandidate.update(stats);
743
+
713
744
  this.observedIceCandidates.set(stats.id, observedIceCandidate);
714
745
  this.emit('added-ice-candidate', observedIceCandidate);
746
+ } else {
747
+ observedIceCandidate.update(stats);
715
748
  }
716
-
717
- observedIceCandidate.update(stats);
749
+ this.emit('updated-ice-candidate', observedIceCandidate);
718
750
 
719
751
  return observedIceCandidate;
720
752
  }
@@ -732,11 +764,14 @@ export class ObservedPeerConnection extends EventEmitter {
732
764
 
733
765
  observedIceCandidatePair = new ObservedIceCandidatePair(stats.timestamp, stats.id, this);
734
766
 
767
+ observedIceCandidatePair.update(stats);
768
+
735
769
  this.observedIceCandidatesPair.set(stats.id, observedIceCandidatePair);
736
770
  this.emit('added-ice-candidate-pair', observedIceCandidatePair);
771
+ } else {
772
+ observedIceCandidatePair.update(stats);
737
773
  }
738
-
739
- observedIceCandidatePair.update(stats);
774
+ this.emit('updated-ice-candidate-pair', observedIceCandidatePair);
740
775
 
741
776
  return observedIceCandidatePair;
742
777
  }
@@ -754,11 +789,14 @@ export class ObservedPeerConnection extends EventEmitter {
754
789
 
755
790
  observedIceTransport = new ObservedIceTransport(stats.timestamp, stats.id, this);
756
791
 
792
+ observedIceTransport.update(stats);
793
+
757
794
  this.observedIceTransports.set(stats.id, observedIceTransport);
758
795
  this.emit('added-ice-transport', observedIceTransport);
796
+ } else {
797
+ observedIceTransport.update(stats);
759
798
  }
760
-
761
- observedIceTransport.update(stats);
799
+ this.emit('updated-ice-transport', observedIceTransport);
762
800
 
763
801
  return observedIceTransport;
764
802
  }
@@ -782,12 +820,15 @@ export class ObservedPeerConnection extends EventEmitter {
782
820
  stats.trackIdentifier,
783
821
  this
784
822
  );
823
+
824
+ observedInboundRtp.update(stats);
785
825
 
786
826
  this.observedInboundRtps.set(stats.ssrc, observedInboundRtp);
787
827
  this.emit('added-inbound-rtp', observedInboundRtp);
828
+ } else {
829
+ observedInboundRtp.update(stats);
788
830
  }
789
-
790
- observedInboundRtp.update(stats);
831
+ this.emit('updated-inbound-rtp', observedInboundRtp);
791
832
 
792
833
  return observedInboundRtp;
793
834
  }
@@ -816,11 +857,14 @@ export class ObservedPeerConnection extends EventEmitter {
816
857
  mediaPlayout,
817
858
  );
818
859
 
860
+ observedInboundTrack.update(stats);
861
+
819
862
  this.observedInboundTracks.set(stats.id, observedInboundTrack);
820
863
  this.emit('added-inbound-track', observedInboundTrack);
864
+ } else {
865
+ observedInboundTrack.update(stats);
821
866
  }
822
-
823
- observedInboundTrack.update(stats);
867
+ this.emit('updated-inbound-track', observedInboundTrack);
824
868
 
825
869
  return observedInboundTrack;
826
870
  }
@@ -843,11 +887,14 @@ export class ObservedPeerConnection extends EventEmitter {
843
887
  this
844
888
  );
845
889
 
890
+ observedMediaPlayout.update(stats);
891
+
846
892
  this.observedMediaPlayouts.set(stats.id, observedMediaPlayout);
847
893
  this.emit('added-media-playout', observedMediaPlayout);
894
+ } else {
895
+ observedMediaPlayout.update(stats);
848
896
  }
849
-
850
- observedMediaPlayout.update(stats);
897
+ this.emit('updated-media-playout', observedMediaPlayout);
851
898
 
852
899
  return observedMediaPlayout;
853
900
  }
@@ -870,11 +917,14 @@ export class ObservedPeerConnection extends EventEmitter {
870
917
  this
871
918
  );
872
919
 
920
+ observedMediaSource.update(stats);
921
+
873
922
  this.observedMediaSources.set(stats.id, observedMediaSource);
874
923
  this.emit('added-media-source', observedMediaSource);
924
+ } else {
925
+ observedMediaSource.update(stats);
875
926
  }
876
-
877
- observedMediaSource.update(stats);
927
+ this.emit('updated-media-source', observedMediaSource);
878
928
 
879
929
  return observedMediaSource;
880
930
  }
@@ -898,11 +948,14 @@ export class ObservedPeerConnection extends EventEmitter {
898
948
  this
899
949
  );
900
950
 
951
+ observedOutboundRtp.update(stats);
952
+
901
953
  this.observedOutboundRtps.set(stats.ssrc, observedOutboundRtp);
902
954
  this.emit('added-outbound-rtp', observedOutboundRtp);
955
+ } else {
956
+ observedOutboundRtp.update(stats);
903
957
  }
904
-
905
- observedOutboundRtp.update(stats);
958
+ this.emit('updated-outbound-rtp', observedOutboundRtp);
906
959
 
907
960
  return observedOutboundRtp;
908
961
  }
@@ -930,11 +983,14 @@ export class ObservedPeerConnection extends EventEmitter {
930
983
  observedMediaSource,
931
984
  );
932
985
 
986
+ observedOutboundTrack.update(stats);
987
+
933
988
  this.observedOutboundTracks.set(stats.id, observedOutboundTrack);
934
989
  this.emit('added-outbound-track', observedOutboundTrack);
990
+ } else {
991
+ observedOutboundTrack.update(stats);
935
992
  }
936
-
937
- observedOutboundTrack.update(stats);
993
+ this.emit('updated-outbound-track', observedOutboundTrack);
938
994
 
939
995
  return observedOutboundTrack;
940
996
  }
@@ -952,11 +1008,14 @@ export class ObservedPeerConnection extends EventEmitter {
952
1008
 
953
1009
  observedPeerConnectionTransport = new ObservedPeerConnectionTransport(stats.timestamp, stats.id, this);
954
1010
 
1011
+ observedPeerConnectionTransport.update(stats);
1012
+
955
1013
  this.observedPeerConnectionTransports.set(stats.id, observedPeerConnectionTransport);
956
1014
  this.emit('added-peer-connection-transport', observedPeerConnectionTransport);
1015
+ } else {
1016
+ observedPeerConnectionTransport.update(stats);
957
1017
  }
958
-
959
- observedPeerConnectionTransport.update(stats);
1018
+ this.emit('updated-peer-connection-transport', observedPeerConnectionTransport);
960
1019
 
961
1020
  return observedPeerConnectionTransport;
962
1021
  }
@@ -980,11 +1039,14 @@ export class ObservedPeerConnection extends EventEmitter {
980
1039
  this
981
1040
  );
982
1041
 
1042
+ observedRemoteInboundRtp.update(stats);
1043
+
983
1044
  this.observedRemoteInboundRtps.set(stats.ssrc, observedRemoteInboundRtp);
984
1045
  this.emit('added-remote-inbound-rtp', observedRemoteInboundRtp);
1046
+ } else {
1047
+ observedRemoteInboundRtp.update(stats);
985
1048
  }
986
-
987
- observedRemoteInboundRtp.update(stats);
1049
+ this.emit('updated-remote-inbound-rtp', observedRemoteInboundRtp);
988
1050
 
989
1051
  return observedRemoteInboundRtp;
990
1052
  }
@@ -1008,11 +1070,14 @@ export class ObservedPeerConnection extends EventEmitter {
1008
1070
  this
1009
1071
  );
1010
1072
 
1073
+ observedRemoteOutboundRtp.update(stats);
1074
+
1011
1075
  this.observedRemoteOutboundRtps.set(stats.ssrc, observedRemoteOutboundRtp);
1012
1076
  this.emit('added-remote-outbound-rtp', observedRemoteOutboundRtp);
1077
+ } else {
1078
+ observedRemoteOutboundRtp.update(stats);
1013
1079
  }
1014
-
1015
- observedRemoteOutboundRtp.update(stats);
1080
+ this.emit('updated-remote-outbound-rtp', observedRemoteOutboundRtp);
1016
1081
 
1017
1082
  return observedRemoteOutboundRtp;
1018
1083
  }
package/src/Observer.ts CHANGED
@@ -7,8 +7,10 @@ import { ObservedTURN } from './ObservedTURN';
7
7
  import { Detectors } from './detectors/Detectors';
8
8
  import { Updater } from './updaters/Updater';
9
9
  import { OnIntervalUpdater } from './updaters/OnIntervalUpdater';
10
- import { OnAllCallObserverUpdater } from './updaters/OnAllCallObserverUpdater_';
11
- import { OnAnyCallObserverUpdater } from './updaters/OnAnyCallObserverUpdater_';
10
+ import { OnAllCallObserverUpdater } from './updaters/OnAllCallObserverUpdater';
11
+ import { OnAnyCallObserverUpdater } from './updaters/OnAnyCallObserverUpdater';
12
+ import { ObserverEventMonitor } from './ObserverEventMonitor';
13
+ import { MediasoupRemoteTrackResolver } from './utils/MediasoupRemoteTrackResolver';
12
14
 
13
15
  const logger = createLogger('Observer');
14
16
 
@@ -23,11 +25,12 @@ export type ObserverEvents = {
23
25
  'close': [],
24
26
  }
25
27
 
26
- export type ObserverConfig = {
28
+ export type ObserverConfig<AppData extends Record<string, unknown> = Record<string, unknown>> = {
27
29
  updatePolicy?: 'update-on-any-call-updated' | 'update-when-all-call-updated' | 'update-on-interval',
28
30
  updateIntervalInMs?: number,
29
31
  defaultCallUpdatePolicy?: ObservedCallSettings['updatePolicy'],
30
32
  defaultCallUpdateIntervalInMs?: number,
33
+ appData?: AppData,
31
34
  }
32
35
 
33
36
  export declare interface Observer {
@@ -37,7 +40,7 @@ export declare interface Observer {
37
40
  emit<U extends keyof ObserverEvents>(event: U, ...args: ObserverEvents[U]): boolean;
38
41
  }
39
42
 
40
- export class Observer extends EventEmitter {
43
+ export class Observer<AppData extends Record<string, unknown> = Record<string, unknown>> extends EventEmitter {
41
44
  public readonly detectors: Detectors;
42
45
 
43
46
  public readonly observedTURN = new ObservedTURN();
@@ -67,9 +70,10 @@ export class Observer extends EventEmitter {
67
70
 
68
71
  private _timer?: ReturnType<typeof setInterval>;
69
72
 
70
- public constructor(public readonly config: ObserverConfig = {
73
+ public constructor(public readonly config: ObserverConfig<AppData> = {
71
74
  updatePolicy: 'update-when-all-call-updated',
72
75
  updateIntervalInMs: undefined,
76
+ appData: {} as AppData,
73
77
  }) {
74
78
  super();
75
79
  this.setMaxListeners(Infinity);
@@ -108,6 +112,10 @@ export class Observer extends EventEmitter {
108
112
  this.detectors = new Detectors();
109
113
  }
110
114
 
115
+ public get appData() {
116
+ return this.config.appData;
117
+ }
118
+
111
119
  public getObservedCall<T extends Record<string, unknown> = Record<string, unknown>>(callId: string): ObservedCall<T> | undefined {
112
120
  if (this.closed || !this.observedCalls.has(callId)) return;
113
121
 
@@ -124,12 +132,15 @@ export class Observer extends EventEmitter {
124
132
  settings.updatePolicy = this.config.defaultCallUpdatePolicy;
125
133
  settings.updateIntervalInMs = this.config.defaultCallUpdateIntervalInMs;
126
134
  }
127
-
128
135
  const observedCall = new ObservedCall(settings, this);
129
136
  const onCallUpdated = () => this._onObservedCallUpdated(observedCall);
130
137
 
131
138
  if (this.observedCalls.has(observedCall.callId)) throw new Error(`Observed Call with id ${observedCall.callId} already exists`);
132
139
 
140
+ if (settings.remoteTrackResolvePolicy === 'mediasoup-sfu') {
141
+ observedCall.remoteTrackResolver = new MediasoupRemoteTrackResolver(observedCall);
142
+ }
143
+
133
144
  observedCall.once('close', () => {
134
145
  this.observedCalls.delete(observedCall.callId);
135
146
  observedCall.off('update', onCallUpdated);
@@ -210,6 +221,10 @@ export class Observer extends EventEmitter {
210
221
  this.totalClientIssues += call.deltaNumberOfIssues;
211
222
  }
212
223
 
224
+ public createEventMonitor<CTX = unknown>(ctx?: CTX): ObserverEventMonitor<CTX> {
225
+ return new ObserverEventMonitor<CTX>(this, ctx ?? {} as CTX);
226
+ }
227
+
213
228
  // public resetSummaryMetrics() {
214
229
  // this.totalAddedCall = 0;
215
230
  // this.totalRemovedCall = 0;