@@ -19,7 +19,7 @@ export default class MissingStreamDataDetector extends BaseIssueDetector {
1919
2020 constructor ( params : MissingStreamDetectorParams = { } ) {
2121 super ( ) ;
22- this . #timeoutMs = params . timeoutMs ?? 5_000 ;
22+ this . #timeoutMs = params . timeoutMs ?? 10_000 ;
2323 }
2424
2525 performDetection ( data : WebRTCStatsParsed ) : IssueDetectorResult {
@@ -32,19 +32,31 @@ export default class MissingStreamDataDetector extends BaseIssueDetector {
3232 private processData ( data : WebRTCStatsParsed ) : IssueDetectorResult {
3333 const issues : IssueDetectorResult = [ ] ;
3434
35+ const prevData = this . getLastProcessedStats ( data . connection . id ) ;
36+
3537 const { video : { inbound : newVideoInbound } } = data ;
3638 const { audio : { inbound : newAudioInbound } } = data ;
39+ const prevVideoInbound = prevData ?. video . inbound ;
40+ const prevAudioInbound = prevData ?. audio . inbound ;
41+
42+
43+ if ( prevAudioInbound ) {
44+ issues . push ( ...this . detectMissingData (
45+ newAudioInbound as unknown as CommonParsedInboundStreamStats [ ] ,
46+ prevAudioInbound as unknown as CommonParsedInboundStreamStats [ ] ,
47+ IssueType . Stream ,
48+ IssueReason . MissingAudioStreamData ,
49+ ) ) ;
50+ }
3751
38- issues . push ( ...this . detectMissingData (
39- newAudioInbound as unknown as CommonParsedInboundStreamStats [ ] ,
40- IssueType . Stream ,
41- IssueReason . MissingAudioStreamData ,
42- ) ) ;
43- issues . push ( ...this . detectMissingData (
44- newVideoInbound ,
45- IssueType . Stream ,
46- IssueReason . MissingVideoStreamData ,
47- ) ) ;
52+ if ( prevVideoInbound ) {
53+ issues . push ( ...this . detectMissingData (
54+ newVideoInbound ,
55+ prevVideoInbound ,
56+ IssueType . Stream ,
57+ IssueReason . MissingVideoStreamData ,
58+ ) ) ;
59+ }
4860
4961 const unvisitedTrackIds = new Set ( this . #lastMarkedAt. keys ( ) ) ;
5062
@@ -59,23 +71,40 @@ export default class MissingStreamDataDetector extends BaseIssueDetector {
5971 }
6072
6173 private detectMissingData (
62- commonStreamStats : CommonParsedInboundStreamStats [ ] ,
74+ currentCommonInboundStats : CommonParsedInboundStreamStats [ ] ,
75+ previousCommonInboundStats : CommonParsedInboundStreamStats [ ] ,
76+ // commonStreamStats: CommonParsedInboundStreamStats[],
6377 type : IssueType ,
6478 reason : IssueReason ,
6579 ) : IssueDetectorResult {
6680 const issues : IssuePayload [ ] = [ ] ;
6781
68- commonStreamStats . forEach ( ( inboundItem ) => {
82+ const mapStatsByTrackId = ( items : CommonParsedInboundStreamStats [ ] ) => new Map < string , CommonParsedInboundStreamStats > (
83+ items . map ( ( item ) => [ item . track . trackIdentifier , item ] as const ) ,
84+ ) ;
85+
86+ const prevInboundItemsByTrackId = mapStatsByTrackId ( previousCommonInboundStats ) ;
87+
88+ currentCommonInboundStats . forEach ( ( inboundItem ) => {
6989 const trackId = inboundItem . track . trackIdentifier ;
7090
71- if ( inboundItem . bytesReceived === 0 && ! inboundItem . track . detached && ! inboundItem . track . ended ) {
91+ const prevInboundItem = prevInboundItemsByTrackId . get ( trackId ) ;
92+ if ( ! prevInboundItem ) {
93+ return ;
94+ }
95+
96+ const bytesReceivedDelta = inboundItem . bytesReceived - prevInboundItem . bytesReceived ;
97+
98+
99+ if ( bytesReceivedDelta === 0 && ! inboundItem . track . detached && ! inboundItem . track . ended ) {
72100 const hasIssue = this . markIssue ( trackId ) ;
73101
74102 if ( ! hasIssue ) {
75103 return ;
76104 }
77105
78106 const statsSample = {
107+ bytesReceivedDelta,
79108 bytesReceived : inboundItem . bytesReceived ,
80109 trackDetached : inboundItem . track . detached ,
81110 trackEnded : inboundItem . track . ended ,
0 commit comments