Maintain application metadata in beacon connection

This commit is contained in:
Héctor Ramón Jiménez 2025-05-01 04:19:44 +02:00
parent dc69fdee46
commit e82b10da77
No known key found for this signature in database
GPG key ID: 7CC46565708259A7
6 changed files with 88 additions and 21 deletions

View file

@ -30,6 +30,8 @@ pub enum Message {
at: SystemTime,
name: String,
version: Version,
theme: Option<theme::Palette>,
can_time_travel: bool,
},
EventLogged {
at: SystemTime,
@ -77,15 +79,22 @@ impl Client {
}
}
#[derive(Debug, Clone, Default)]
pub struct Metadata {
pub name: &'static str,
pub theme: Option<theme::Palette>,
pub can_time_travel: bool,
}
#[must_use]
pub fn connect(name: String) -> Client {
pub fn connect(metadata: Metadata) -> Client {
let (sender, receiver) = mpsc::channel(10_000);
let is_connected = Arc::new(AtomicBool::new(false));
let handle = {
let is_connected = is_connected.clone();
std::thread::spawn(move || run(name, is_connected, receiver))
std::thread::spawn(move || run(metadata, is_connected, receiver))
};
Client {
@ -108,7 +117,7 @@ pub enum Command {
#[tokio::main]
async fn run(
name: String,
mut metadata: Metadata,
is_connected: Arc<AtomicBool>,
mut receiver: mpsc::Receiver<Action>,
) {
@ -133,8 +142,10 @@ async fn run(
&mut writer,
Message::Connected {
at: SystemTime::now(),
name: name.clone(),
name: metadata.name.to_owned(),
version: version.clone(),
can_time_travel: metadata.can_time_travel,
theme: metadata.theme,
},
)
.await;
@ -148,6 +159,16 @@ async fn run(
loop {
match receive(&mut reader, &mut buffer).await {
Ok(command) => {
match command {
Command::RewindTo { .. }
| Command::GoLive
if !metadata.can_time_travel =>
{
continue;
}
_ => {}
}
let sender = command_sender.lock().await;
let _ = sender.send(command).await;
}
@ -161,6 +182,14 @@ async fn run(
while let Some(action) = receiver.recv().await {
match action {
Action::Send(message) => {
if let Message::EventLogged {
event: Event::ThemeChanged(palette),
..
} = message
{
metadata.theme = Some(palette);
}
match send(&mut writer, message).await {
Ok(()) => {}
Err(error) => {

View file

@ -53,6 +53,8 @@ pub enum Event {
at: SystemTime,
name: String,
version: Version,
theme: Option<theme::Palette>,
can_time_travel: bool,
},
Disconnected {
at: SystemTime,
@ -161,6 +163,8 @@ pub fn run() -> impl Stream<Item = Event> {
at,
name,
version,
theme,
can_time_travel,
} => {
let _ = output
.send(Event::Connected {
@ -170,6 +174,8 @@ pub fn run() -> impl Stream<Item = Event> {
at,
name,
version,
theme,
can_time_travel,
})
.await;
}