mirror of
https://github.com/R0m1k3/xtremflow.git
synced 2026-10-11 17:30:00 +02:00
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>
48 lines
1.4 KiB
Dart
48 lines
1.4 KiB
Dart
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')));
|
|
});
|
|
});
|
|
}
|