cat / goq
clone

turns a linux box into a private steam streaming appliance: plug in, tap your key, play from another computer

fix/docs-activation-truth
goq / portal / frame-stats.test.mjs
frame-stats.test.mjs 8.0K
1import test from 'node:test';2import assert from 'node:assert/strict';3import {4 formatVideoDiscardTelemetry,5 isCurrentFrameGeneration,6 normalizeFrameStatsPayload,7} from './frame-stats.mjs';89test('formats each video discard owner in exact frame units', () => {10 assert.deepEqual(formatVideoDiscardTelemetry({11 transportDroppedFrames: 3,12 frontendDroppedFrames: 4,13 decoderDroppedFrames: 5,14 presenterOverwrittenFrames: 6,15 }), {16 total: '18 frames',17 transport: '3 frames',18 frontend: '4 frames',19 decoder: '5 frames',20 presenterOverwrite: '6 frames',21 });2223 assert.equal(formatVideoDiscardTelemetry({24 transportDroppedFrames: 0,25 frontendDroppedFrames: 0,26 decoderDroppedFrames: 0,27 presenterOverwrittenFrames: 1,28 }).presenterOverwrite, '1 frame');29});3031test('rejects inexact video discard counters and totals', () => {32 assert.throws(() => formatVideoDiscardTelemetry({33 transportDroppedFrames: -1,34 frontendDroppedFrames: 0,35 decoderDroppedFrames: 0,36 presenterOverwrittenFrames: 0,37 }), /exact unsigned integers/);3839 assert.throws(() => formatVideoDiscardTelemetry({40 transportDroppedFrames: Number.MAX_SAFE_INTEGER,41 frontendDroppedFrames: 1,42 decoderDroppedFrames: 0,43 presenterOverwrittenFrames: 0,44 }), /exact integer range/);45});4647test('accepts frame stats only for the exact active nonzero generation', () => {48 assert.equal(isCurrentFrameGeneration(7, 7), true);49 assert.equal(isCurrentFrameGeneration(6, 7), false);50 assert.equal(isCurrentFrameGeneration(0, 0), false);51 assert.equal(isCurrentFrameGeneration(undefined, undefined), false);52 assert.equal(isCurrentFrameGeneration(Number.MAX_SAFE_INTEGER + 1, 7), false);53});5455test('normalizes exact v2 drop, queue, timing, and resync units', () => {56 assert.deepEqual(normalizeFrameStatsPayload({57 stats_version: 2,58 sequence_dropped_total: 3,59 frontend_queue_dropped_total: 4,60 frontend_resync_dropped_total: 5,61 frontend_dropped_total: 9,62 frontend_queue_depth: 1,63 frontend_queue_peak: 3,64 frontend_queue_capacity: 4,65 frontend_resync_episode_total: 2,66 frontend_resync_active: true,67 frontend_resync_duration_ms_total: 125.5,68 frontend_resync_duration_ms_current: 25.25,69 frontend_resync_duration_ms_max: 100.25,70 timing_window_ms: 5000,71 timing_sample_capacity: 512,72 transport_interval_sample_count: 3,73 transport_interval_p50_ms: 16.6,74 transport_interval_p95_ms: 25.1,75 transport_interval_max_ms: 40.2,76 frontend_ipc_send_duration_sample_count: 2,77 frontend_ipc_send_duration_p50_ms: 0.1,78 frontend_ipc_send_duration_p95_ms: 0.4,79 frontend_ipc_send_duration_max_ms: 0.4,80 }), {81 statsVersion: 2,82 transportDroppedFrames: 3,83 objectDroppedFrames: null,84 lateObjectDroppedFrames: null,85 frontendDroppedFrames: 9,86 queueDroppedFrames: 4,87 resyncDroppedFrames: 5,88 queue: { depth: 1, peak: 3, capacity: 4 },89 resync: { episodes: 2, active: true, totalMs: 125.5, currentMs: 25.25, maxMs: 100.25 },90 transportIntervals: { count: 3, p50Ms: 16.6, p95Ms: 25.1, maxMs: 40.2 },91 ipcSendDurations: { count: 2, p50Ms: 0.1, p95Ms: 0.4, maxMs: 0.4 },92 timingWindow: { windowMs: 5000, sampleCapacity: 512 },93 networkDiagnostics: null,94 });95});9697test('uses legacy aggregate drop aliases without inventing v2 splits', () => {98 const stats = normalizeFrameStatsPayload({99 host_dropped_frames: 7,100 frontend_dropped_frames: 11,101 });102 assert.equal(stats.statsVersion, 1);103 assert.equal(stats.transportDroppedFrames, 7);104 assert.equal(stats.objectDroppedFrames, null);105 assert.equal(stats.lateObjectDroppedFrames, null);106 assert.equal(stats.frontendDroppedFrames, 11);107 assert.equal(stats.queueDroppedFrames, null);108 assert.equal(stats.resyncDroppedFrames, null);109 assert.equal(stats.queue, null);110 assert.equal(stats.resync, null);111 assert.equal(stats.transportIntervals, null);112 assert.equal(stats.ipcSendDurations, null);113 assert.equal(stats.timingWindow, null);114 assert.equal(stats.networkDiagnostics, null);115});116117test('normalizes v4 network diagnostics without changing v1-v3 behavior', () => {118 const leg = {119 mode: 'direct',120 sample_count: 1,121 direct_samples: 1,122 relay_samples: 0,123 custom_samples: 0,124 unknown_samples: 0,125 path_epoch: 1,126 path_switch_total: 0,127 mode_transition_total: 0,128 rtt_sample_count: 1,129 rtt_current_ms: 0.8,130 rtt_p50_ms: 5,131 rtt_p95_ms: 5,132 rtt_max_ms: 5,133 rtt_overflow_total: 0,134 tx_datagrams: 1,135 tx_bytes: 100,136 rx_datagrams: 1,137 rx_bytes: 100,138 lost_packets: 0,139 lost_bytes: 0,140 cwnd_bytes: 12000,141 mtu: 1200,142 congestion_events: 0,143 black_holes_detected: 0,144 counter_regression_total: 0,145 complete: true,146 };147 const inputAck = {148 negotiated: true,149 sent_total: 1,150 acknowledged_total: 1,151 pending_count: 0,152 pending_capacity: 64,153 duplicate_total: 0,154 untracked_total: 0,155 malformed: false,156 closed: false,157 latency_sample_count: 1,158 latency_p50_ms: 2,159 latency_p95_ms: 2,160 latency_max_ms: 2,161 latency_overflow_total: 0,162 complete: true,163 };164 const raw = {165 version: 2,166 session_elapsed_ms: 1000,167 media: leg,168 input: leg,169 audio: null,170 input_ack: inputAck,171 adaptive: {172 scope: 'local_viewer',173 local_pressure: 'awaiting_report',174 aggregate_target_kbps: null,175 aggregate_state: 'unavailable',176 recovery_state: 'active',177 applied: false,178 },179 session: {180 mode: 'legacy_exclusive_v1',181 local_handle: null,182 focus_generation: null,183 roster_revision: null,184 roster_age_ms: null,185 subscription_expires_at_unix: null,186 subscription_seconds_remaining: null,187 stale_snapshot_total: 0,188 invalid_snapshot_total: 0,189 },190 };191192 const v5 = normalizeFrameStatsPayload({ stats_version: 5, network_diagnostics: raw });193 assert.equal(v5.networkDiagnostics.media.mode, 'direct');194 assert.equal(v5.networkDiagnostics.inputAck.acknowledgedTotal, 1);195196 const v3 = normalizeFrameStatsPayload({ stats_version: 3, network_diagnostics: raw });197 assert.equal(v3.networkDiagnostics, null);198 const malformed = normalizeFrameStatsPayload({199 stats_version: 4,200 network_diagnostics: { ...raw, media: { ...leg, complete: 'yes' } },201 });202 assert.equal(malformed.networkDiagnostics, null);203});204205test('normalizes bounded v3 independent-object discard counters', () => {206 const stats = normalizeFrameStatsPayload({207 stats_version: 3,208 transport_object_dropped_total: 8,209 transport_late_object_dropped_total: 3,210 });211 assert.equal(stats.objectDroppedFrames, 8);212 assert.equal(stats.lateObjectDroppedFrames, 3);213214 const malformed = normalizeFrameStatsPayload({215 stats_version: 3,216 transport_object_dropped_total: 2,217 transport_late_object_dropped_total: 3,218 });219 assert.equal(malformed.objectDroppedFrames, null);220 assert.equal(malformed.lateObjectDroppedFrames, null);221});222223test('does not display malformed or unit-ambiguous v2 diagnostics', () => {224 const stats = normalizeFrameStatsPayload({225 stats_version: 2,226 frontend_queue_dropped_total: 2,227 frontend_resync_dropped_total: 3,228 transport_interval_sample_count: 1,229 transport_interval_p50_ms: 10,230 transport_interval_p95_ms: Number.NaN,231 transport_interval_max_ms: 20,232 frontend_resync_episode_total: 1,233 frontend_resync_active: false,234 frontend_resync_duration_ms_total: 20,235 frontend_resync_duration_ms_current: 4,236 frontend_resync_duration_ms_max: 20,237 });238 assert.equal(stats.frontendDroppedFrames, 5);239 assert.equal(stats.transportIntervals, null);240 assert.equal(stats.resync, null);241});242243test('represents empty timing windows without fabricated percentiles', () => {244 const stats = normalizeFrameStatsPayload({245 stats_version: 2,246 transport_interval_sample_count: 0,247 frontend_ipc_send_duration_sample_count: 0,248 });249 assert.deepEqual(stats.transportIntervals, {250 count: 0, p50Ms: null, p95Ms: null, maxMs: null,251 });252 assert.deepEqual(stats.ipcSendDurations, {253 count: 0, p50Ms: null, p95Ms: null, maxMs: null,254 });255});