enostr: use data instead of strings in Pubkey and EventId
Signed-off-by: William Casarin <jb55@jb55.com>
This commit is contained in:
@@ -1,6 +1,7 @@
|
||||
use crate::Error;
|
||||
use crate::Event;
|
||||
use crate::Result;
|
||||
use log::debug;
|
||||
use serde_json::Value;
|
||||
|
||||
use ewebsock::{WsEvent, WsMessage};
|
||||
@@ -76,19 +77,19 @@ impl RelayMessage {
|
||||
// I was lazy and took this from the nostr crate. thx yuki!
|
||||
pub fn from_json(msg: &str) -> Result<Self> {
|
||||
if msg.is_empty() {
|
||||
return Err(Error::MessageEmpty);
|
||||
return Err(Error::Empty);
|
||||
}
|
||||
|
||||
let v: Vec<Value> = serde_json::from_str(msg).map_err(|_| Error::MessageDecodeFailed)?;
|
||||
let v: Vec<Value> = serde_json::from_str(msg).map_err(|_| Error::DecodeFailed)?;
|
||||
|
||||
// Notice
|
||||
// Relay response format: ["NOTICE", <message>]
|
||||
if v[0] == "NOTICE" {
|
||||
if v.len() != 2 {
|
||||
return Err(Error::MessageDecodeFailed);
|
||||
return Err(Error::DecodeFailed);
|
||||
}
|
||||
let v_notice: String =
|
||||
serde_json::from_value(v[1].clone()).map_err(|_| Error::MessageDecodeFailed)?;
|
||||
serde_json::from_value(v[1].clone()).map_err(|_| Error::DecodeFailed)?;
|
||||
return Ok(Self::notice(v_notice));
|
||||
}
|
||||
|
||||
@@ -96,14 +97,13 @@ impl RelayMessage {
|
||||
// Relay response format: ["EVENT", <subscription id>, <event JSON>]
|
||||
if v[0] == "EVENT" {
|
||||
if v.len() != 3 {
|
||||
return Err(Error::MessageDecodeFailed);
|
||||
return Err(Error::DecodeFailed);
|
||||
}
|
||||
|
||||
let event =
|
||||
Event::from_json(&v[2].to_string()).map_err(|_| Error::MessageDecodeFailed)?;
|
||||
let event = Event::from_json(&v[2].to_string()).map_err(|_| Error::DecodeFailed)?;
|
||||
|
||||
let subscription_id: String =
|
||||
serde_json::from_value(v[1].clone()).map_err(|_| Error::MessageDecodeFailed)?;
|
||||
serde_json::from_value(v[1].clone()).map_err(|_| Error::DecodeFailed)?;
|
||||
|
||||
return Ok(Self::event(event, subscription_id));
|
||||
}
|
||||
@@ -112,11 +112,11 @@ impl RelayMessage {
|
||||
// Relay response format: ["EOSE", <subscription_id>]
|
||||
if v[0] == "EOSE" {
|
||||
if v.len() != 2 {
|
||||
return Err(Error::MessageDecodeFailed);
|
||||
return Err(Error::DecodeFailed);
|
||||
}
|
||||
|
||||
let subscription_id: String =
|
||||
serde_json::from_value(v[1].clone()).map_err(|_| Error::MessageDecodeFailed)?;
|
||||
serde_json::from_value(v[1].clone()).map_err(|_| Error::DecodeFailed)?;
|
||||
|
||||
return Ok(Self::eose(subscription_id));
|
||||
}
|
||||
@@ -125,22 +125,22 @@ impl RelayMessage {
|
||||
// Relay response format: ["OK", <event_id>, <true|false>, <message>]
|
||||
if v[0] == "OK" {
|
||||
if v.len() != 4 {
|
||||
return Err(Error::MessageDecodeFailed);
|
||||
return Err(Error::DecodeFailed);
|
||||
}
|
||||
|
||||
let event_id: String =
|
||||
serde_json::from_value(v[1].clone()).map_err(|_| Error::MessageDecodeFailed)?;
|
||||
serde_json::from_value(v[1].clone()).map_err(|_| Error::DecodeFailed)?;
|
||||
|
||||
let status: bool =
|
||||
serde_json::from_value(v[2].clone()).map_err(|_| Error::MessageDecodeFailed)?;
|
||||
serde_json::from_value(v[2].clone()).map_err(|_| Error::DecodeFailed)?;
|
||||
|
||||
let message: String =
|
||||
serde_json::from_value(v[3].clone()).map_err(|_| Error::MessageDecodeFailed)?;
|
||||
serde_json::from_value(v[3].clone()).map_err(|_| Error::DecodeFailed)?;
|
||||
|
||||
return Ok(Self::ok(event_id, status, message));
|
||||
}
|
||||
|
||||
Err(Error::MessageDecodeFailed)
|
||||
Err(Error::DecodeFailed)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -169,16 +169,19 @@ mod tests {
|
||||
|
||||
assert_eq!(
|
||||
RelayMessage::from_json(invalid_notice_msg).unwrap_err(),
|
||||
Error::MessageDecodeFailed
|
||||
Error::DecodeFailed
|
||||
);
|
||||
assert_eq!(
|
||||
RelayMessage::from_json(invalid_notice_msg_content).unwrap_err(),
|
||||
Error::MessageDecodeFailed
|
||||
Error::DecodeFailed
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_handle_valid_event() -> Result<()> {
|
||||
use log::debug;
|
||||
|
||||
env_logger::init();
|
||||
let valid_event_msg = r#"["EVENT", "random_string", {"id":"70b10f70c1318967eddf12527799411b1a9780ad9c43858f5e5fcd45486a13a5","pubkey":"379e863e8357163b5bce5d2688dc4f1dcc2d505222fb8d74db600f30535dfdfe","created_at":1612809991,"kind":1,"tags":[],"content":"test","sig":"273a9cd5d11455590f4359500bccb7a89428262b96b3ea87a756b770964472f8c3e87f5d5e64d8d2e859a71462a3f477b554565c4f2f326cb01dd7620db71502"}]"#;
|
||||
|
||||
let id = "70b10f70c1318967eddf12527799411b1a9780ad9c43858f5e5fcd45486a13a5";
|
||||
@@ -190,9 +193,13 @@ mod tests {
|
||||
let sig = "273a9cd5d11455590f4359500bccb7a89428262b96b3ea87a756b770964472f8c3e87f5d5e64d8d2e859a71462a3f477b554565c4f2f326cb01dd7620db71502";
|
||||
|
||||
let handled_event = Event::new_dummy(id, pubkey, created_at, kind, tags, content, sig);
|
||||
debug!("event {:?}", handled_event);
|
||||
|
||||
let msg = RelayMessage::from_json(valid_event_msg);
|
||||
debug!("msg {:?}", msg);
|
||||
|
||||
assert_eq!(
|
||||
RelayMessage::from_json(valid_event_msg)?,
|
||||
msg?,
|
||||
RelayMessage::event(handled_event?, "random_string".to_string())
|
||||
);
|
||||
|
||||
@@ -208,12 +215,12 @@ mod tests {
|
||||
|
||||
assert_eq!(
|
||||
RelayMessage::from_json(invalid_event_msg).unwrap_err(),
|
||||
Error::MessageDecodeFailed
|
||||
Error::DecodeFailed
|
||||
);
|
||||
|
||||
assert_eq!(
|
||||
RelayMessage::from_json(invalid_event_msg_content).unwrap_err(),
|
||||
Error::MessageDecodeFailed
|
||||
Error::DecodeFailed
|
||||
);
|
||||
}
|
||||
|
||||
@@ -234,13 +241,13 @@ mod tests {
|
||||
// Missing subscription ID
|
||||
assert_eq!(
|
||||
RelayMessage::from_json(r#"["EOSE"]"#).unwrap_err(),
|
||||
Error::MessageDecodeFailed
|
||||
Error::DecodeFailed
|
||||
);
|
||||
|
||||
// The subscription ID is not string
|
||||
assert_eq!(
|
||||
RelayMessage::from_json(r#"["EOSE", 404]"#).unwrap_err(),
|
||||
Error::MessageDecodeFailed
|
||||
Error::DecodeFailed
|
||||
);
|
||||
}
|
||||
|
||||
@@ -265,19 +272,19 @@ mod tests {
|
||||
r#"["OK", "b1a649ebe8b435ec71d3784793f3bbf4b93e64e17568a741aecd4c7ddeafce30"]"#
|
||||
)
|
||||
.unwrap_err(),
|
||||
Error::MessageDecodeFailed
|
||||
Error::DecodeFailed
|
||||
);
|
||||
|
||||
// Invalid status
|
||||
assert_eq!(
|
||||
RelayMessage::from_json(r#"["OK", "b1a649ebe8b435ec71d3784793f3bbf4b93e64e17568a741aecd4c7ddeafce30", hello, ""]"#).unwrap_err(),
|
||||
Error::MessageDecodeFailed
|
||||
Error::DecodeFailed
|
||||
);
|
||||
|
||||
// Invalid message
|
||||
assert_eq!(
|
||||
RelayMessage::from_json(r#"["OK", "b1a649ebe8b435ec71d3784793f3bbf4b93e64e17568a741aecd4c7ddeafce30", hello, 404]"#).unwrap_err(),
|
||||
Error::MessageDecodeFailed
|
||||
Error::DecodeFailed
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -141,7 +141,10 @@ impl RelayPool {
|
||||
Ok(())
|
||||
}
|
||||
|
||||
/// Attempts to receive a pool event from a list of relays. The function searches each relay in the list in order, attempting to receive a message from each. If a message is received, return it. If no message is received from any relays, None is returned.
|
||||
/// Attempts to receive a pool event from a list of relays. The
|
||||
/// function searches each relay in the list in order, attempting to
|
||||
/// receive a message from each. If a message is received, return it.
|
||||
/// If no message is received from any relays, None is returned.
|
||||
pub fn try_recv(&mut self) -> Option<PoolEvent<'_>> {
|
||||
for relay in &mut self.relays {
|
||||
let relay = &mut relay.relay;
|
||||
@@ -149,6 +152,7 @@ impl RelayPool {
|
||||
match msg.try_into() {
|
||||
Ok(event) => {
|
||||
relay.status = RelayStatus::Connected;
|
||||
|
||||
// let's just handle pongs here.
|
||||
// We only need to do this natively.
|
||||
#[cfg(not(target_arch = "wasm32"))]
|
||||
|
||||
Reference in New Issue
Block a user