Include event sequence number in ALiS frames

This commit is contained in:
Marcin Kulik
2025-02-15 17:06:37 +01:00
parent b7d66e5f63
commit fd04f1acb9
4 changed files with 41 additions and 17 deletions

View File

@@ -451,7 +451,7 @@ div.ap-player div.ap-control-bar {
opacity: 0;
transition: opacity 0.15s linear;
user-select: none;
border-top: 2px solid color-mix(in oklab, black 33%, var(--term-color-background));
border-top: 2px solid color-mix(in oklab, var(--term-color-background) 80%, var(--term-color-foreground));
z-index: 30;
}
div.ap-player div.ap-control-bar * {
@@ -712,7 +712,6 @@ span.ap-marker-container:hover span.ap-marker {
font-size: 18px;
color: var(--term-color-foreground);
background-color: var(--term-color-background);
border-radius: 6px;
box-sizing: border-box;
margin-bottom: 32px;
}
@@ -728,6 +727,8 @@ span.ap-marker-container:hover span.ap-marker {
.ap-player .ap-overlay-help > div div {
padding: calc(min(4cqw, 40px));
font-size: calc(min(1.9cqw, 18px));
border: 1px solid color-mix(in oklab, var(--term-color-background) 90%, var(--term-color-foreground));
border-radius: 6px;
}
.ap-player .ap-overlay-help > div div p {
font-weight: bold;

File diff suppressed because one or more lines are too long

View File

@@ -37,7 +37,8 @@ fn serialize_event(event: session::Event, prev_event_time: u64) -> (Vec<u8>, u64
use session::Event::*;
match event {
Init(time, size, theme, init) => {
Init(last_id, time, size, theme, init) => {
let last_id_bytes = leb128::encode(last_id);
let time_bytes = leb128::encode(time);
let cols_bytes = leb128::encode(size.0);
let rows_bytes = leb128::encode(size.1);
@@ -45,6 +46,7 @@ fn serialize_event(event: session::Event, prev_event_time: u64) -> (Vec<u8>, u64
let init_len_bytes = leb128::encode(init_len);
let mut msg = vec![0x01];
msg.extend_from_slice(&last_id_bytes);
msg.extend_from_slice(&time_bytes);
msg.extend_from_slice(&cols_bytes);
msg.extend_from_slice(&rows_bytes);
@@ -77,12 +79,14 @@ fn serialize_event(event: session::Event, prev_event_time: u64) -> (Vec<u8>, u64
(msg, time)
}
Output(time, text) => {
Output(id, time, text) => {
let id_bytes = leb128::encode(id);
let time_bytes = leb128::encode(time - prev_event_time);
let text_len = text.len() as u32;
let text_len_bytes = leb128::encode(text_len);
let mut msg = vec![b'o'];
msg.extend_from_slice(&id_bytes);
msg.extend_from_slice(&time_bytes);
msg.extend_from_slice(&text_len_bytes);
msg.extend_from_slice(text.as_bytes());
@@ -90,12 +94,14 @@ fn serialize_event(event: session::Event, prev_event_time: u64) -> (Vec<u8>, u64
(msg, time)
}
Input(time, text) => {
Input(id, time, text) => {
let id_bytes = leb128::encode(id);
let time_bytes = leb128::encode(time - prev_event_time);
let text_len = text.len() as u32;
let text_len_bytes = leb128::encode(text_len);
let mut msg = vec![b'i'];
msg.extend_from_slice(&id_bytes);
msg.extend_from_slice(&time_bytes);
msg.extend_from_slice(&text_len_bytes);
msg.extend_from_slice(text.as_bytes());
@@ -103,12 +109,14 @@ fn serialize_event(event: session::Event, prev_event_time: u64) -> (Vec<u8>, u64
(msg, time)
}
Resize(time, size) => {
Resize(id, time, size) => {
let id_bytes = leb128::encode(id);
let time_bytes = leb128::encode(time - prev_event_time);
let cols_bytes = leb128::encode(size.0);
let rows_bytes = leb128::encode(size.1);
let mut msg = vec![b'r'];
msg.extend_from_slice(&id_bytes);
msg.extend_from_slice(&time_bytes);
msg.extend_from_slice(&cols_bytes);
msg.extend_from_slice(&rows_bytes);
@@ -116,12 +124,14 @@ fn serialize_event(event: session::Event, prev_event_time: u64) -> (Vec<u8>, u64
(msg, time)
}
Marker(time, text) => {
Marker(id, time, text) => {
let id_bytes = leb128::encode(id);
let time_bytes = leb128::encode(time - prev_event_time);
let text_len = text.len() as u32;
let text_len_bytes = leb128::encode(text_len);
let mut msg = vec![b'm'];
msg.extend_from_slice(&id_bytes);
msg.extend_from_slice(&time_bytes);
msg.extend_from_slice(&text_len_bytes);
msg.extend_from_slice(text.as_bytes());

View File

@@ -13,6 +13,7 @@ pub struct Session {
vt: avt::Vt,
broadcast_tx: broadcast::Sender<Event>,
stream_time: u64,
last_event_id: u64,
last_event_time: Instant,
theme: Option<tty::Theme>,
output_decoder: util::Utf8Decoder,
@@ -21,11 +22,11 @@ pub struct Session {
#[derive(Clone)]
pub enum Event {
Init(u64, tty::TtySize, Option<tty::Theme>, String),
Output(u64, String),
Input(u64, String),
Resize(u64, tty::TtySize),
Marker(u64, String),
Init(u64, u64, tty::TtySize, Option<tty::Theme>, String),
Output(u64, u64, String),
Input(u64, u64, String),
Resize(u64, u64, tty::TtySize),
Marker(u64, u64, String),
}
pub struct Client(oneshot::Sender<Subscription>);
@@ -43,6 +44,7 @@ impl Session {
vt: build_vt(tty_size),
broadcast_tx,
stream_time: 0,
last_event_id: 0,
last_event_time: Instant::now(),
theme,
output_decoder: util::Utf8Decoder::new(),
@@ -55,7 +57,8 @@ impl Session {
if !text.is_empty() {
self.vt.feed_str(&text);
let _ = self.broadcast_tx.send(Event::Output(time, text));
let id = self.get_next_event_id();
let _ = self.broadcast_tx.send(Event::Output(id, time, text));
}
self.stream_time = time;
@@ -66,7 +69,8 @@ impl Session {
let text = self.input_decoder.feed(data);
if !text.is_empty() {
let _ = self.broadcast_tx.send(Event::Input(time, text));
let id = self.get_next_event_id();
let _ = self.broadcast_tx.send(Event::Input(id, time, text));
}
self.stream_time = time;
@@ -76,7 +80,8 @@ impl Session {
pub fn resize(&mut self, time: u64, tty_size: tty::TtySize) {
if tty_size != self.vt.size().into() {
self.vt.resize(tty_size.0.into(), tty_size.1.into());
let _ = self.broadcast_tx.send(Event::Resize(time, tty_size));
let id = self.get_next_event_id();
let _ = self.broadcast_tx.send(Event::Resize(id, time, tty_size));
}
self.stream_time = time;
@@ -84,13 +89,15 @@ impl Session {
}
pub fn marker(&mut self, time: u64) {
let _ = self.broadcast_tx.send(Event::Marker(time, String::new()));
let id = self.get_next_event_id();
let _ = self.broadcast_tx.send(Event::Marker(id, time, String::new()));
self.stream_time = time;
self.last_event_time = Instant::now();
}
pub fn subscribe(&self) -> Subscription {
let init = Event::Init(
self.last_event_id,
self.elapsed_time(),
self.vt.size().into(),
self.theme.clone(),
@@ -106,6 +113,12 @@ impl Session {
self.broadcast_tx.receiver_count()
}
fn get_next_event_id(&mut self) -> u64 {
self.last_event_id += 1;
self.last_event_id
}
fn elapsed_time(&self) -> u64 {
self.stream_time + self.last_event_time.elapsed().as_micros() as u64
}