This commit is contained in:
2026-08-11 20:25:26 -04:00
parent a902f7522d
commit 0438bade23
2 changed files with 62 additions and 15 deletions
+31 -2
View File
@@ -4,12 +4,41 @@ use super::*;
impl super::Client { impl super::Client {
pub async fn initialize(mut socket: WebSocket) -> anyhow::Result<Self> { pub async fn initialize(mut socket: WebSocket) -> anyhow::Result<Self> {
if let Some(ServerMessage::Initialize()) = Client::read_socket(&mut socket).await? {} let Some(ServerMethod::Initialize {
public_key,
timestamp,
signature,
}) = Client::read_socket(&mut socket).await?
else {
Client::send_socket(
&mut socket,
ClientMethod::Error {
error: Cow::Borrowed(
"Failed to initialize, unexpected method, expected: initialize",
),
},
)
.await?;
return Err(anyhow::anyhow!(
"Failed to initialize: Client sent the wrong method"
));
};
Client::send_socket(
&mut socket,
ClientMethod::Initialized {
public_key,
timestamp,
signature,
},
)
.await?;
Ok(Self { Ok(Self {
socket, socket,
meta: super::ClientMeta {}, meta: super::ClientMeta {},
pub_key: String::new(), public_key: String::new(),
}) })
} }
} }
+31 -13
View File
@@ -1,3 +1,5 @@
use std::borrow::Cow;
use axum::extract::ws::{Message, Utf8Bytes, WebSocket}; use axum::extract::ws::{Message, Utf8Bytes, WebSocket};
use serde::{Deserialize, Serialize}; use serde::{Deserialize, Serialize};
@@ -6,24 +8,41 @@ pub mod initialize;
pub struct Client { pub struct Client {
pub socket: WebSocket, pub socket: WebSocket,
pub meta: ClientMeta, pub meta: ClientMeta,
pub pub_key: String, pub public_key: String,
} }
#[derive(Debug, Clone, Serialize, Deserialize)] #[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ClientMeta {} pub struct ClientMeta {}
#[derive(Debug, Clone, Serialize, Deserialize)] #[derive(Debug, Clone, Serialize, Deserialize)]
pub enum ClientMessage<'a> { #[serde(tag = "method")]
Error(&'a str), pub enum ClientMethod {
Initialized {
public_key: String,
timestamp: u64,
signature: String,
},
#[serde(rename = "error")]
Error { error: Cow<'static, str> },
} }
#[derive(Debug, Clone, Serialize, Deserialize)] #[derive(Debug, Clone, Serialize, Deserialize)]
pub enum ServerMessage { #[serde(tag = "method")]
Initialize(), pub enum ServerMethod {
Initialize {
public_key: String,
timestamp: u64,
signature: String,
},
Error {
error: String,
},
} }
impl Client { impl Client {
pub async fn read_socket(socket: &mut WebSocket) -> anyhow::Result<Option<ServerMessage>> { pub async fn read_socket(socket: &mut WebSocket) -> anyhow::Result<Option<ServerMethod>> {
match socket.recv().await.transpose()? { match socket.recv().await.transpose()? {
Some(Message::Text(text)) => { Some(Message::Text(text)) => {
if let Ok(msg) = serde_json::from_str(&text.to_string()) { if let Ok(msg) = serde_json::from_str(&text.to_string()) {
@@ -31,7 +50,9 @@ impl Client {
} else { } else {
Client::send_socket( Client::send_socket(
socket, socket,
ClientMessage::Error("Unable to parse message: {text}"), ClientMethod::Error {
error: Cow::Borrowed("Unable to parse message: {text}"),
},
) )
.await?; .await?;
@@ -51,10 +72,7 @@ impl Client {
} }
} }
pub async fn send_socket<'a>( pub async fn send_socket(socket: &mut WebSocket, message: ClientMethod) -> anyhow::Result<()> {
socket: &mut WebSocket,
message: ClientMessage<'a>,
) -> anyhow::Result<()> {
socket socket
.send(Message::Text(Utf8Bytes::from(serde_json::to_string( .send(Message::Text(Utf8Bytes::from(serde_json::to_string(
&message, &message,
@@ -64,11 +82,11 @@ impl Client {
Ok(()) Ok(())
} }
pub async fn read(&mut self) -> anyhow::Result<Option<ServerMessage>> { pub async fn read(&mut self) -> anyhow::Result<Option<ServerMethod>> {
Self::read_socket(&mut self.socket).await Self::read_socket(&mut self.socket).await
} }
pub async fn send<'a>(&mut self, message: ClientMessage<'a>) -> anyhow::Result<()> { pub async fn send(&mut self, message: ClientMethod) -> anyhow::Result<()> {
Self::send_socket(&mut self.socket, message).await Self::send_socket(&mut self.socket, message).await
} }
} }