mirror of
https://github.com/R0m1k3/xtremflow.git
synced 2026-10-20 05:28:05 +02:00
Diagnostic : le lecteur remonte ses freezes dans les logs du serveur
Les freezes (image et son figés puis reprise) se produisent dans le navigateur de l'utilisateur ; le serveur n'en voyait rien. Le lecteur envoie désormais chaque coupure (durée, buffer), saut (de → vers), erreur MPEG-TS/HLS, recréation, repli HLS et changement de profil, plus un bilan toutes les 60 s, à POST /api/player-log (authentifié). Le serveur écrit une ligne « [Player] … » par événement. Entrée filtrée : événements et champs connus seulement, texte borné, URL masquées (une erreur réseau peut recopier les identifiants Xtream), pas d'injection de lignes. Envoi jamais bloquant pour la lecture. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
775caad0ee
commit
a739d6451c
5 files changed
+292
-1
No files matched your search
@@ -0,0 +1,47 @@
|
||||
import 'package:test/test.dart';
|
||||
import '../api/player_log.dart';
|
||||
|
||||
void main() {
|
||||
group('formatPlayerEvent', () {
|
||||
test('écrit une coupure avec sa durée et le buffer', () {
|
||||
expect(
|
||||
formatPlayerEvent({
|
||||
'event': 'stall',
|
||||
'session': 'ab12',
|
||||
'ch': '554034',
|
||||
'ms': 5230,
|
||||
'buffer': 0.04,
|
||||
}),
|
||||
'[Player] stall session=ab12 ch=554034 ms=5230 buffer=0.0',
|
||||
);
|
||||
});
|
||||
|
||||
test('refuse un événement inconnu ou un payload invalide', () {
|
||||
expect(formatPlayerEvent({'event': 'rm -rf'}), isNull);
|
||||
expect(formatPlayerEvent('stall'), isNull);
|
||||
expect(formatPlayerEvent(null), isNull);
|
||||
});
|
||||
|
||||
test('pas d\'injection de lignes ni d\'URL (identifiants Xtream)', () {
|
||||
final line = formatPlayerEvent({
|
||||
'event': 'mpegts_error',
|
||||
'detail': 'NetworkError http://panel/live/user/pass/1.ts\n[Player] faux',
|
||||
})!;
|
||||
expect(line, isNot(contains('\n')));
|
||||
expect(line, isNot(contains('user/pass')));
|
||||
expect(line, contains('<url>'));
|
||||
});
|
||||
|
||||
test('ignore les champs inattendus et les nombres non finis', () {
|
||||
final line = formatPlayerEvent({
|
||||
'event': 'seek',
|
||||
'from': 10,
|
||||
'to': double.infinity,
|
||||
'cookie': 'secret',
|
||||
})!;
|
||||
expect(line, contains('from=10'));
|
||||
expect(line, isNot(contains('to=')));
|
||||
expect(line, isNot(contains('secret')));
|
||||
});
|
||||
});
|
||||
}
|
||||
Reference in new issue
Block a user