diff --git a/Cargo.lock b/Cargo.lock index bff0452..a2eb8c6 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -359,6 +359,7 @@ dependencies = [ "tokio", "tokio-tungstenite", "tungstenite", + "uuid", ] [[package]] @@ -923,6 +924,15 @@ version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" +[[package]] +name = "uuid" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc5cf98d8186244414c848017f0e2676b3fcb46807f6668a97dfe67359a3c4b7" +dependencies = [ + "getrandom", +] + [[package]] name = "version_check" version = "0.9.3" diff --git a/Cargo.toml b/Cargo.toml index 5a848a3..03f8ee3 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -13,6 +13,7 @@ futures-util = "0.3.17" tokio-tungstenite = "0.16.0" tungstenite = "0.16.0" thiserror = "1.0.30" +uuid = { version = "0.8", features = ["v4"] } bitcoin_hashes = { version = "0.10.0", features = ["serde"] } diff --git a/src/main.rs b/src/main.rs index f4d369f..7d249af 100644 --- a/src/main.rs +++ b/src/main.rs @@ -2,6 +2,7 @@ use std::{env, io::Error}; use futures_util::{SinkExt, StreamExt}; use log::{debug, info, warn}; +use nostr_rs_relay::proto::Proto; use tokio::net::{TcpListener, TcpStream}; use tokio::runtime::Builder; use tokio_tungstenite::WebSocketStream; @@ -67,9 +68,9 @@ async fn nostr_server(stream: TcpStream) { // Handles valid clients who have upgraded to WebSockets async fn process_client(stream: WebSocketStream) { + // get a protocol helper; + let proto = Proto::new(); let (mut write, mut read) = stream.split(); - // TODO: error on binary messages - // TODO: error on text messages > MAX_EVENT_SIZE // TODO: select on a timeout to kill non-responsive clients while let Some(mes_res) = read.next().await { @@ -86,6 +87,7 @@ async fn process_client(stream: WebSocketStream) { ))) .await .expect("send failed"); + proto.process_message(cmd); // Handle this request. Everything else below is basically error handling. } Ok(Message::Binary(_)) => { diff --git a/src/request.rs b/src/request.rs index 8798ca2..f057780 100644 --- a/src/request.rs +++ b/src/request.rs @@ -1 +1,43 @@ +use crate::error::{Error, Result}; +use serde::{Deserialize, Deserializer, Serialize}; +//use serde_json::json; +//use serde_json::Result; + + +// Container for a request filter +#[derive(Serialize, Deserialize, PartialEq, Debug, Clone)] +pub struct ReqCmd { + + #[serde(deserialize_with = "u32_from_string")] + id: u32, + #[serde(deserialize_with = "u32_from_string")] + pubkey: u32, + created_at: u64, + kind: u8, + #[serde(deserialize_with = "tag_from_string")] + tags: Vec>, + content: String, + #[serde(deserialize_with = "u64_from_string")] + sig: u64, +} + +#[derive(Serialize, Deserialize, PartialEq, Debug, Clone)] +pub struct Subscription { + id: String, + Vec +} + +#[derive(Serialize, Deserialize, PartialEq, Debug, Clone)] +pub struct ReqFilter { + id: Option, + author: Option, + kind: Option, + #[serde(rename = "e#")] + event: Option, + #[serde(rename = "p#")] + pubkey: Option, + since: Option, + authors: Option>, +} + pub struct Request {}