use std::fs::File;
use std::io::{self, BufWriter, Write};
use std::path::Path;
use std::time::Instant;
use super::Event;
pub struct MlogWriter {
writer: BufWriter<File>,
start_time: Instant,
}
impl MlogWriter {
pub fn new(path: impl AsRef<Path>) -> io::Result<Self> {
let file = File::create(path)?;
let mut writer = BufWriter::new(file);
let start_time = Instant::now();
let header = serde_json::json!({
"qlog_version": "0.3",
"qlog_format": "JSON-SEQ",
"title": "moq-relay",
"description": "MoQ Transport events",
"trace": {
"vantage_point": {
"type": "server"
},
"event_schemas": [
"urn:ietf:params:qlog:events:loglevel",
"urn:ietf:params:qlog:events:moqt"
]
}
});
serde_json::to_writer(&mut writer, &header)?;
writer.write_all(b"\n")?;
writer.flush()?;
Ok(Self { writer, start_time })
}
pub fn elapsed_ms(&self) -> f64 {
self.start_time.elapsed().as_secs_f64() * 1000.0
}
pub fn add_event(&mut self, event: Event) -> io::Result<()> {
serde_json::to_writer(&mut self.writer, &event)?;
self.writer.write_all(b"\n")?;
self.writer.flush()?;
Ok(())
}
pub fn finish(mut self) -> io::Result<()> {
self.writer.flush()
}
}