Skip to content

Commit 8f2084b

Browse files
feat: calculate bytes received delta
1 parent da3b55f commit 8f2084b

File tree

1 file changed

+43
-14
lines changed

1 file changed

+43
-14
lines changed

src/detectors/MissingStreamDataDetector.ts

Lines changed: 43 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)