""" stream_replay.py — Rejoue un fichier JSONL sur stdout avec timing optionnel. Simule le streaming live d'un capteur ROV. Peut se chaîner avec process.py : python3 stream_replay.py | python3 process.py --stdin python3 stream_replay.py --realtime | python3 process.py --stdin Usage : python3 stream_replay.py [--input ../data/sim/run_L.jsonl] [--realtime] [--speed 10.0] """ import argparse import json import sys import time import os def replay( input_path: str, realtime: bool = False, speed: float = 1.0, output=None, ): """ Lit le JSONL et écrit sur stdout (ou output) ligne par ligne. Si realtime=True, attend le bon délai entre les lignes. speed > 1 accélère le replay (utile pour tests). """ if output is None: output = sys.stdout prev_t = None n = 0 with open(input_path) as f: for line in f: line = line.strip() if not line: continue if realtime: try: rec = json.loads(line) t = rec.get("t", 0.0) if prev_t is not None: dt = (t - prev_t) / speed if dt > 0: time.sleep(dt) prev_t = t except json.JSONDecodeError: pass output.write(line + "\n") output.flush() n += 1 # Signal de fin (ligne vide → process.py ignore) sys.stderr.write(f"[stream_replay] {n} lignes émises\n") if __name__ == "__main__": parser = argparse.ArgumentParser(description="Replay JSONL stream") parser.add_argument("--input", default="../data/sim/run_L.jsonl") parser.add_argument("--realtime", action="store_true", help="Respecter les délais temporels") parser.add_argument("--speed", type=float, default=1.0, help="Facteur d'accélération (ex: 10 = 10x plus rapide)") args = parser.parse_args() if not os.path.exists(args.input): sys.stderr.write(f"ERREUR : fichier introuvable : {args.input}\n") sys.exit(1) replay( input_path=args.input, realtime=args.realtime, speed=args.speed, )