mirror of
https://github.com/asciinema/asciinema.git
synced 2025-12-16 11:48:13 +01:00
Include event sequence number in ALiS frames
This commit is contained in:
5
assets/asciinema-player.css
vendored
5
assets/asciinema-player.css
vendored
@@ -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;
|
||||
|
||||
2
assets/asciinema-player.min.js
vendored
2
assets/asciinema-player.min.js
vendored
File diff suppressed because one or more lines are too long
@@ -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());
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user