use std::sync::Arc;
use gled_model::input::event::InputEvent;
use gled_model::timing::BeatState;
use serde::{Deserialize, Serialize};
use crate::assets::{AnyAsset, AssetChanges};
use crate::bytes::SharedBytes;
use crate::midi::MidiMonitorEvent;
use crate::project_update::ProjectUpdate;
use crate::state::{ClientInput, EngineEvent, EngineState, RenderStats, SoundSnapshot};
pub const PROTOCOL_VERSION: u32 = 1;
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Serialize, Deserialize)]
#[serde(default)]
pub struct Subscriptions {
pub preview: bool,
pub sound: bool,
pub input_events: bool,
pub midi: bool,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub enum ClientMessage {
Hello {
protocol_version: u32,
app_version: String,
},
Input(ClientInput),
Subscribe(Subscriptions),
Ping(u64),
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub enum ServerMessage {
Welcome {
client_id: u64,
app_version: String,
},
Rejected {
reason: String,
},
State {
state: Arc<EngineState>,
applied_sequence: u64,
},
Update {
state: Arc<EngineState>,
project: ProjectUpdate,
applied_sequence: u64,
},
Timing {
beat: BeatState,
render: RenderStats,
},
Assets(Vec<AnyAsset>),
AssetsChanged(AssetChanges),
Preview(SharedBytes),
Sound(Arc<SoundSnapshot>),
InputEvents(Vec<InputEvent>),
MidiMonitor(Vec<MidiMonitorEvent>),
MidiLearn(Vec<[u8; 3]>),
Event(EngineEvent),
Pong(u64),
}