mirror of
https://github.com/R0m1k3/xtremflow.git
synced 2026-10-20 13:38:05 +02:00
Lecture TV : traverser les silences du panneau sans figer
Télémétrie d'un freeze en prod : le panneau s'est tu ~15-20 s sur une connexion restée ouverte (aucune reconnexion FFmpeg dans les logs). Le lecteur n'avait gardé que 11-16 s d'avance — il « consommait » à x1,1 celle que le panneau envoie au démarrage pour revenir à 12 s — puis, après la coupure de 6,3 s, il repartait avec 1 s de stock et recoupait aussitôt (1,7 s puis 2,0 s). - réserve visée 25 s (liveSync 25/35, saut au-delà de 45 s) : ~25 s de retard sur le direct en échange de la traversée de ces silences - après une coupure, attente de 4 s de réserve avant de relire (comme mpv cache-pause), 15 s au plus ; une pause utilisateur l'annule ; le lecteur lite affiche « Reconstitution de la réserve » au lieu du bouton lecture Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
a739d6451c
commit
0539ad857f
3 files changed
+123
-6
No files matched your search
@@ -149,6 +149,65 @@ test('télémétrie : une coupure (waiting → playing) est remontée avec sa du
|
||||
assert.equal(sent[0].url, '/api/player-log');
|
||||
});
|
||||
|
||||
// Freeze mesuré en prod (télémétrie) : le panneau s'est tu ~15-20 s sur une
|
||||
// connexion restée ouverte, alors que le lecteur n'avait gardé que 11-16 s.
|
||||
const PROVIDER_OUTAGE_S = 18;
|
||||
|
||||
test('live : la réserve visée couvre un silence du panneau de ~18 s', () => {
|
||||
const c = liveMpegtsConfig();
|
||||
// liveSync ramène le retard vers la cible : c'est la réserve en régime
|
||||
// établi. Elle doit dépasser le silence mesuré.
|
||||
assert.ok(c.liveSyncTargetLatency > PROVIDER_OUTAGE_S,
|
||||
`cible ${c.liveSyncTargetLatency}s < silence mesuré ${PROVIDER_OUTAGE_S}s`);
|
||||
assert.ok(c.liveBufferLatencyMinRemain > PROVIDER_OUTAGE_S);
|
||||
});
|
||||
|
||||
test('reprise après coupure : attendre une vraie réserve avant de relire', () => {
|
||||
const calls = [];
|
||||
const listeners = {};
|
||||
let ahead = 0;
|
||||
const video = {
|
||||
addEventListener(type, fn) { (listeners[type] ||= []).push(fn); },
|
||||
removeEventListener() {},
|
||||
canPlayType: () => '',
|
||||
play: () => { calls.push('play'); return Promise.resolve(); },
|
||||
pause: () => { calls.push('pause'); },
|
||||
get buffered() { return { length: 1, start: () => 0, end: () => 100 + ahead }; },
|
||||
seekable: { length: 0 },
|
||||
currentTime: 100,
|
||||
playbackRate: 1,
|
||||
seeking: false,
|
||||
};
|
||||
const fire = (type) => (listeners[type] || []).forEach((fn) => fn());
|
||||
const window = {
|
||||
addEventListener() {}, removeEventListener() {},
|
||||
console: { log() {} },
|
||||
location: { origin: 'https://xf.test', href: 'https://xf.test/', search: '' },
|
||||
parent: { postMessage() {} },
|
||||
};
|
||||
const context = vm.createContext({
|
||||
window, location: window.location,
|
||||
document: { addEventListener() {}, removeEventListener() {} },
|
||||
URLSearchParams, setInterval: () => 0, clearInterval() {}, setTimeout, Date,
|
||||
});
|
||||
vm.runInContext(source, context);
|
||||
const player = new window.XFPlayer({ video, url: '/api/live/1/turbo.ts', type: 'live' });
|
||||
player.mpegts = {}; // flux MPEG-TS en cours
|
||||
player._wireVideoEvents();
|
||||
|
||||
fire('playing');
|
||||
fire('waiting'); // le panneau se tait
|
||||
assert.deepEqual(calls.slice(-1), ['pause'], 'le lecteur doit se mettre en attente');
|
||||
|
||||
ahead = 1; // 1 s arrive : trop peu, ne pas repartir
|
||||
player._checkHold();
|
||||
assert.ok(!calls.slice(1).includes('play'), 'reparti avec 1 s : recoupera aussitôt');
|
||||
|
||||
ahead = 5; // vraie réserve reconstituée
|
||||
player._checkHold();
|
||||
assert.equal(calls.at(-1), 'play');
|
||||
});
|
||||
|
||||
test('live : le buffer déjà lu est purgé (sinon QuotaExceeded en séance longue)', () => {
|
||||
const c = liveMpegtsConfig();
|
||||
assert.equal(c.autoCleanupSourceBuffer, true);
|
||||
|
||||
Reference in new issue
Block a user