@observertc/observer-js 1.0.1-797e5af.0 → 1.0.1-7be4daa.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 (60) 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 +2 -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/ObservedPeerConnection.d.ts.map +1 -1
  14. package/lib/ObservedPeerConnection.js +60 -15
  15. package/lib/Observer.d.ts +8 -4
  16. package/lib/Observer.d.ts.map +1 -1
  17. package/lib/Observer.js +14 -2
  18. package/lib/ObserverEventMonitor.d.ts +106 -0
  19. package/lib/ObserverEventMonitor.d.ts.map +1 -0
  20. package/lib/ObserverEventMonitor.js +320 -0
  21. package/lib/index.d.ts +1 -0
  22. package/lib/index.d.ts.map +1 -1
  23. package/lib/index.js +3 -1
  24. package/lib/schema/ClientEventTypes.d.ts +17 -0
  25. package/lib/schema/ClientEventTypes.d.ts.map +1 -1
  26. package/lib/schema/ClientSample.d.ts +1 -1
  27. package/lib/schema/ClientSample.d.ts.map +1 -1
  28. package/lib/updaters/{OnAllCallObserverUpdater_.d.ts → OnAllCallObserverUpdater.d.ts} +3 -1
  29. package/lib/updaters/OnAllCallObserverUpdater.d.ts.map +1 -0
  30. package/lib/updaters/{OnAllCallObserverUpdater_.js → OnAllCallObserverUpdater.js} +13 -1
  31. package/lib/updaters/OnAllClientCallUpdater.d.ts +2 -0
  32. package/lib/updaters/OnAllClientCallUpdater.d.ts.map +1 -1
  33. package/lib/updaters/OnAllClientCallUpdater.js +16 -0
  34. package/lib/updaters/{OnAnyCallObserverUpdater_.d.ts → OnAnyCallObserverUpdater.d.ts} +2 -1
  35. package/lib/updaters/OnAnyCallObserverUpdater.d.ts.map +1 -0
  36. package/lib/updaters/{OnAnyCallObserverUpdater_.js → OnAnyCallObserverUpdater.js} +11 -1
  37. package/lib/updaters/OnAnyClientCallUpdater.d.ts +1 -0
  38. package/lib/updaters/OnAnyClientCallUpdater.d.ts.map +1 -1
  39. package/lib/updaters/OnAnyClientCallUpdater.js +11 -2
  40. package/lib/utils/MediasoupRemoteTrackResolver.d.ts +25 -0
  41. package/lib/utils/MediasoupRemoteTrackResolver.d.ts.map +1 -0
  42. package/lib/utils/MediasoupRemoteTrackResolver.js +110 -0
  43. package/package.json +1 -1
  44. package/src/ObservedCall.ts +5 -0
  45. package/src/ObservedCallEventMonitor.ts +392 -0
  46. package/src/ObservedClient.ts +4 -7
  47. package/src/ObservedIceCandidatePair.ts +18 -2
  48. package/src/ObservedPeerConnection.ts +60 -30
  49. package/src/Observer.ts +21 -6
  50. package/src/ObserverEventMonitor.ts +398 -0
  51. package/src/index.ts +1 -0
  52. package/src/schema/ClientEventTypes.ts +18 -0
  53. package/src/schema/ClientSample.ts +1 -1
  54. package/src/updaters/{OnAllCallObserverUpdater_.ts → OnAllCallObserverUpdater.ts} +14 -1
  55. package/src/updaters/OnAllClientCallUpdater.ts +15 -0
  56. package/src/updaters/{OnAnyCallObserverUpdater_.ts → OnAnyCallObserverUpdater.ts} +12 -3
  57. package/src/updaters/OnAnyClientCallUpdater.ts +9 -2
  58. package/src/utils/MediasoupRemoteTrackResolver.ts +155 -0
  59. package/lib/updaters/OnAllCallObserverUpdater_.d.ts.map +0 -1
  60. package/lib/updaters/OnAnyCallObserverUpdater_.d.ts.map +0 -1
@@ -10,7 +10,6 @@ import { ClientMetaTypes } from './schema/ClientMetaTypes';
10
10
  import { parseJsonAs } from './common/utils';
11
11
  import { CalculatedScore } from './scores/CalculatedScore';
12
12
  import { Detectors } from './detectors/Detectors';
13
- import { ObservedClientEventMonitor } from './ObservedClientEventMonitor';
14
13
 
15
14
  const logger = createLogger('ObservedClient');
16
15
 
@@ -34,8 +33,9 @@ export type ObservedClientEvents = {
34
33
  left: [];
35
34
  usingturn: [boolean];
36
35
  usermediaerror: [string];
36
+ extensionStats: [ExtensionStat];
37
+ clientEvent: [ClientEvent];
37
38
 
38
- // do we need this?
39
39
  newpeerconnection: [ObservedPeerConnection];
40
40
  };
41
41
 
@@ -471,8 +471,8 @@ export class ObservedClient<AppData extends Record<string, unknown> = Record<str
471
471
  }
472
472
  break;
473
473
  }
474
-
475
474
  }
475
+ this.emit('clientEvent', event);
476
476
  }
477
477
 
478
478
  public injectMetaData(metaData: ClientMetaData) {
@@ -550,6 +550,7 @@ export class ObservedClient<AppData extends Record<string, unknown> = Record<str
550
550
 
551
551
  public addExtensionStats(stats: ExtensionStat) {
552
552
  this.call.observer.emit('client-extension-stats', this, stats);
553
+ this.emit('extensionStats', stats);
553
554
  }
554
555
 
555
556
  private _updatePeerConnection(sample: PeerConnectionSample): ObservedPeerConnection | undefined {
@@ -578,10 +579,6 @@ export class ObservedClient<AppData extends Record<string, unknown> = Record<str
578
579
  return observedPeerConnection;
579
580
  }
580
581
 
581
- public createEventMonitor<CTX = unknown>(ctx?: CTX): ObservedClientEventMonitor<CTX> {
582
- return new ObservedClientEventMonitor<CTX>(this, ctx ?? {} as CTX);
583
- }
584
-
585
582
  private _mergeInjections(sample: ClientSample): ClientSample {
586
583
  if (this.closed) return sample;
587
584
 
@@ -8,7 +8,7 @@ export class ObservedIceCandidatePair implements IceCandidatePairStats {
8
8
  transportId?: string | undefined;
9
9
  localCandidateId?: string | undefined;
10
10
  remoteCandidateId?: string | undefined;
11
- state?: 'new' | 'inProgress' | 'failed' | 'succeeded' | undefined;
11
+ state?: 'new' | 'in-progress' | 'waiting' | 'failed' | 'succeeded' | undefined;
12
12
  nominated?: boolean | undefined;
13
13
  packetsSent?: number | undefined;
14
14
  packetsReceived?: number | undefined;
@@ -93,7 +93,7 @@ export class ObservedIceCandidatePair implements IceCandidatePairStats {
93
93
  this.transportId = stats.transportId;
94
94
  this.localCandidateId = stats.localCandidateId;
95
95
  this.remoteCandidateId = stats.remoteCandidateId;
96
- this.state = stats.state;
96
+ this.state = this._convertState(stats.state);
97
97
  this.nominated = stats.nominated;
98
98
  this.packetsSent = stats.packetsSent;
99
99
  this.packetsReceived = stats.packetsReceived;
@@ -115,4 +115,20 @@ export class ObservedIceCandidatePair implements IceCandidatePairStats {
115
115
  this.attachments = stats.attachments;
116
116
  }
117
117
 
118
+ private _convertState(state: string | undefined) {
119
+ switch (state) {
120
+ case 'new':
121
+ case 'in-progress':
122
+ case 'waiting':
123
+ case 'failed':
124
+ case 'succeeded':
125
+ return state;
126
+ case 'cancelled':
127
+ return 'failed';
128
+ case 'inprogress':
129
+ return 'in-progress';
130
+ default:
131
+ return undefined;
132
+ }
133
+ }
118
134
  }
@@ -644,12 +644,14 @@ export class ObservedPeerConnection extends EventEmitter {
644
644
 
645
645
  observedCertificate = new ObservedCertificate(stats.timestamp, stats.id, this);
646
646
 
647
+ observedCertificate.update(stats);
648
+
647
649
  this.observedCertificates.set(stats.id, observedCertificate);
648
650
  this.emit('added-certificate', observedCertificate);
651
+ } else {
652
+ observedCertificate.update(stats);
649
653
  }
650
654
 
651
- observedCertificate.update(stats);
652
-
653
655
  return observedCertificate;
654
656
  }
655
657
 
@@ -666,12 +668,14 @@ export class ObservedPeerConnection extends EventEmitter {
666
668
 
667
669
  observedCodec = new ObservedCodec(stats.timestamp, stats.id, stats.mimeType, this);
668
670
 
671
+ observedCodec.update(stats);
672
+
669
673
  this.observedCodecs.set(stats.id, observedCodec);
670
674
  this.emit('added-codec', observedCodec);
675
+ } else {
676
+ observedCodec.update(stats);
671
677
  }
672
678
 
673
- observedCodec.update(stats);
674
-
675
679
  return observedCodec;
676
680
  }
677
681
 
@@ -688,12 +692,14 @@ export class ObservedPeerConnection extends EventEmitter {
688
692
 
689
693
  observedDataChannel = new ObservedDataChannel(stats.timestamp, stats.id, this);
690
694
 
695
+ observedDataChannel.update(stats);
696
+
691
697
  this.observedDataChannels.set(stats.id, observedDataChannel);
692
698
  this.emit('added-data-channel', observedDataChannel);
699
+ } else {
700
+ observedDataChannel.update(stats);
693
701
  }
694
702
 
695
- observedDataChannel.update(stats);
696
-
697
703
  return observedDataChannel;
698
704
  }
699
705
 
@@ -710,12 +716,14 @@ export class ObservedPeerConnection extends EventEmitter {
710
716
 
711
717
  observedIceCandidate = new ObservedIceCandidate(stats.timestamp, stats.id, this);
712
718
 
719
+ observedIceCandidate.update(stats);
720
+
713
721
  this.observedIceCandidates.set(stats.id, observedIceCandidate);
714
722
  this.emit('added-ice-candidate', observedIceCandidate);
723
+ } else {
724
+ observedIceCandidate.update(stats);
715
725
  }
716
726
 
717
- observedIceCandidate.update(stats);
718
-
719
727
  return observedIceCandidate;
720
728
  }
721
729
 
@@ -732,12 +740,14 @@ export class ObservedPeerConnection extends EventEmitter {
732
740
 
733
741
  observedIceCandidatePair = new ObservedIceCandidatePair(stats.timestamp, stats.id, this);
734
742
 
743
+ observedIceCandidatePair.update(stats);
744
+
735
745
  this.observedIceCandidatesPair.set(stats.id, observedIceCandidatePair);
736
746
  this.emit('added-ice-candidate-pair', observedIceCandidatePair);
747
+ } else {
748
+ observedIceCandidatePair.update(stats);
737
749
  }
738
750
 
739
- observedIceCandidatePair.update(stats);
740
-
741
751
  return observedIceCandidatePair;
742
752
  }
743
753
 
@@ -754,12 +764,14 @@ export class ObservedPeerConnection extends EventEmitter {
754
764
 
755
765
  observedIceTransport = new ObservedIceTransport(stats.timestamp, stats.id, this);
756
766
 
767
+ observedIceTransport.update(stats);
768
+
757
769
  this.observedIceTransports.set(stats.id, observedIceTransport);
758
770
  this.emit('added-ice-transport', observedIceTransport);
771
+ } else {
772
+ observedIceTransport.update(stats);
759
773
  }
760
774
 
761
- observedIceTransport.update(stats);
762
-
763
775
  return observedIceTransport;
764
776
  }
765
777
 
@@ -782,13 +794,15 @@ export class ObservedPeerConnection extends EventEmitter {
782
794
  stats.trackIdentifier,
783
795
  this
784
796
  );
797
+
798
+ observedInboundRtp.update(stats);
785
799
 
786
800
  this.observedInboundRtps.set(stats.ssrc, observedInboundRtp);
787
801
  this.emit('added-inbound-rtp', observedInboundRtp);
802
+ } else {
803
+ observedInboundRtp.update(stats);
788
804
  }
789
805
 
790
- observedInboundRtp.update(stats);
791
-
792
806
  return observedInboundRtp;
793
807
  }
794
808
 
@@ -816,12 +830,14 @@ export class ObservedPeerConnection extends EventEmitter {
816
830
  mediaPlayout,
817
831
  );
818
832
 
833
+ observedInboundTrack.update(stats);
834
+
819
835
  this.observedInboundTracks.set(stats.id, observedInboundTrack);
820
836
  this.emit('added-inbound-track', observedInboundTrack);
837
+ } else {
838
+ observedInboundTrack.update(stats);
821
839
  }
822
840
 
823
- observedInboundTrack.update(stats);
824
-
825
841
  return observedInboundTrack;
826
842
  }
827
843
 
@@ -843,12 +859,14 @@ export class ObservedPeerConnection extends EventEmitter {
843
859
  this
844
860
  );
845
861
 
862
+ observedMediaPlayout.update(stats);
863
+
846
864
  this.observedMediaPlayouts.set(stats.id, observedMediaPlayout);
847
865
  this.emit('added-media-playout', observedMediaPlayout);
866
+ } else {
867
+ observedMediaPlayout.update(stats);
848
868
  }
849
869
 
850
- observedMediaPlayout.update(stats);
851
-
852
870
  return observedMediaPlayout;
853
871
  }
854
872
 
@@ -870,12 +888,14 @@ export class ObservedPeerConnection extends EventEmitter {
870
888
  this
871
889
  );
872
890
 
891
+ observedMediaSource.update(stats);
892
+
873
893
  this.observedMediaSources.set(stats.id, observedMediaSource);
874
894
  this.emit('added-media-source', observedMediaSource);
895
+ } else {
896
+ observedMediaSource.update(stats);
875
897
  }
876
898
 
877
- observedMediaSource.update(stats);
878
-
879
899
  return observedMediaSource;
880
900
  }
881
901
 
@@ -898,11 +918,13 @@ export class ObservedPeerConnection extends EventEmitter {
898
918
  this
899
919
  );
900
920
 
921
+ observedOutboundRtp.update(stats);
922
+
901
923
  this.observedOutboundRtps.set(stats.ssrc, observedOutboundRtp);
902
924
  this.emit('added-outbound-rtp', observedOutboundRtp);
925
+ } else {
926
+ observedOutboundRtp.update(stats);
903
927
  }
904
-
905
- observedOutboundRtp.update(stats);
906
928
 
907
929
  return observedOutboundRtp;
908
930
  }
@@ -930,12 +952,14 @@ export class ObservedPeerConnection extends EventEmitter {
930
952
  observedMediaSource,
931
953
  );
932
954
 
955
+ observedOutboundTrack.update(stats);
956
+
933
957
  this.observedOutboundTracks.set(stats.id, observedOutboundTrack);
934
958
  this.emit('added-outbound-track', observedOutboundTrack);
959
+ } else {
960
+ observedOutboundTrack.update(stats);
935
961
  }
936
962
 
937
- observedOutboundTrack.update(stats);
938
-
939
963
  return observedOutboundTrack;
940
964
  }
941
965
 
@@ -952,12 +976,14 @@ export class ObservedPeerConnection extends EventEmitter {
952
976
 
953
977
  observedPeerConnectionTransport = new ObservedPeerConnectionTransport(stats.timestamp, stats.id, this);
954
978
 
979
+ observedPeerConnectionTransport.update(stats);
980
+
955
981
  this.observedPeerConnectionTransports.set(stats.id, observedPeerConnectionTransport);
956
982
  this.emit('added-peer-connection-transport', observedPeerConnectionTransport);
983
+ } else {
984
+ observedPeerConnectionTransport.update(stats);
957
985
  }
958
986
 
959
- observedPeerConnectionTransport.update(stats);
960
-
961
987
  return observedPeerConnectionTransport;
962
988
  }
963
989
 
@@ -980,12 +1006,14 @@ export class ObservedPeerConnection extends EventEmitter {
980
1006
  this
981
1007
  );
982
1008
 
1009
+ observedRemoteInboundRtp.update(stats);
1010
+
983
1011
  this.observedRemoteInboundRtps.set(stats.ssrc, observedRemoteInboundRtp);
984
1012
  this.emit('added-remote-inbound-rtp', observedRemoteInboundRtp);
1013
+ } else {
1014
+ observedRemoteInboundRtp.update(stats);
985
1015
  }
986
1016
 
987
- observedRemoteInboundRtp.update(stats);
988
-
989
1017
  return observedRemoteInboundRtp;
990
1018
  }
991
1019
 
@@ -1008,12 +1036,14 @@ export class ObservedPeerConnection extends EventEmitter {
1008
1036
  this
1009
1037
  );
1010
1038
 
1039
+ observedRemoteOutboundRtp.update(stats);
1040
+
1011
1041
  this.observedRemoteOutboundRtps.set(stats.ssrc, observedRemoteOutboundRtp);
1012
1042
  this.emit('added-remote-outbound-rtp', observedRemoteOutboundRtp);
1043
+ } else {
1044
+ observedRemoteOutboundRtp.update(stats);
1013
1045
  }
1014
1046
 
1015
- observedRemoteOutboundRtp.update(stats);
1016
-
1017
1047
  return observedRemoteOutboundRtp;
1018
1048
  }
1019
1049
  }
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;