Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
2e2e01203b | ||
|
|
100f890284 | ||
|
|
0e288fe678 | ||
|
|
bfc804e18c | ||
|
|
8a8ee5c425 | ||
|
|
55bb6bd440 | ||
|
|
7933abaa48 |
Generated
+1
-1
@@ -435,7 +435,7 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "nostr-rs-relay"
|
name = "nostr-rs-relay"
|
||||||
version = "0.1.4"
|
version = "0.1.6"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"bitcoin_hashes",
|
"bitcoin_hashes",
|
||||||
"env_logger",
|
"env_logger",
|
||||||
|
|||||||
+1
-1
@@ -1,6 +1,6 @@
|
|||||||
[package]
|
[package]
|
||||||
name = "nostr-rs-relay"
|
name = "nostr-rs-relay"
|
||||||
version = "0.1.4"
|
version = "0.1.6"
|
||||||
edition = "2021"
|
edition = "2021"
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
|
|||||||
+1
-1
@@ -53,7 +53,7 @@ impl ClientConn {
|
|||||||
v.push(id);
|
v.push(id);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return v;
|
v
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Add a new subscription for this connection.
|
/// Add a new subscription for this connection.
|
||||||
|
|||||||
@@ -229,6 +229,12 @@ fn query_from_sub(sub: &Subscription) -> String {
|
|||||||
let created_clause = format!("created_at > {}", f.since.unwrap());
|
let created_clause = format!("created_at > {}", f.since.unwrap());
|
||||||
filter_components.push(created_clause);
|
filter_components.push(created_clause);
|
||||||
}
|
}
|
||||||
|
// Query for timestamp
|
||||||
|
if f.until.is_some() {
|
||||||
|
let until_clause = format!("created_at < {}", f.until.unwrap());
|
||||||
|
filter_components.push(until_clause);
|
||||||
|
}
|
||||||
|
|
||||||
// combine all clauses, and add to filter_clauses
|
// combine all clauses, and add to filter_clauses
|
||||||
if !filter_components.is_empty() {
|
if !filter_components.is_empty() {
|
||||||
let mut fc = "( ".to_owned();
|
let mut fc = "( ".to_owned();
|
||||||
@@ -246,6 +252,8 @@ fn query_from_sub(sub: &Subscription) -> String {
|
|||||||
query.push_str(" WHERE ");
|
query.push_str(" WHERE ");
|
||||||
query.push_str(&filter_clauses.join(" OR "));
|
query.push_str(&filter_clauses.join(" OR "));
|
||||||
}
|
}
|
||||||
|
// add order clause
|
||||||
|
query.push_str(" ORDER BY created_at ASC");
|
||||||
debug!("query string: {}", query);
|
debug!("query string: {}", query);
|
||||||
query
|
query
|
||||||
}
|
}
|
||||||
|
|||||||
+9
-1
@@ -18,6 +18,7 @@ use tokio::sync::broadcast;
|
|||||||
use tokio::sync::broadcast::{Receiver, Sender};
|
use tokio::sync::broadcast::{Receiver, Sender};
|
||||||
use tokio::sync::mpsc;
|
use tokio::sync::mpsc;
|
||||||
use tokio::sync::oneshot;
|
use tokio::sync::oneshot;
|
||||||
|
use tungstenite::protocol::WebSocketConfig;
|
||||||
|
|
||||||
/// Start running a Nostr relay server.
|
/// Start running a Nostr relay server.
|
||||||
fn main() -> Result<(), Error> {
|
fn main() -> Result<(), Error> {
|
||||||
@@ -93,8 +94,15 @@ async fn nostr_server(
|
|||||||
) {
|
) {
|
||||||
// get a broadcast channel for clients to communicate on
|
// get a broadcast channel for clients to communicate on
|
||||||
let mut bcast_rx = broadcast.subscribe();
|
let mut bcast_rx = broadcast.subscribe();
|
||||||
|
// websocket configuration / limits
|
||||||
|
let config = WebSocketConfig {
|
||||||
|
max_send_queue: None,
|
||||||
|
max_message_size: Some(2 << 19), // 512K
|
||||||
|
max_frame_size: Some(2 << 19), // 512k
|
||||||
|
accept_unmasked_frames: false, // follow the spec
|
||||||
|
};
|
||||||
// upgrade the TCP connection to WebSocket
|
// upgrade the TCP connection to WebSocket
|
||||||
let conn = tokio_tungstenite::accept_async(stream).await;
|
let conn = tokio_tungstenite::accept_async_with_config(stream, Some(config)).await;
|
||||||
let ws_stream = conn.expect("websocket handshake error");
|
let ws_stream = conn.expect("websocket handshake error");
|
||||||
// wrap websocket into a stream & sink of Nostr protocol messages
|
// wrap websocket into a stream & sink of Nostr protocol messages
|
||||||
let mut nostr_stream = protostream::wrap_ws_in_nostr(ws_stream);
|
let mut nostr_stream = protostream::wrap_ws_in_nostr(ws_stream);
|
||||||
|
|||||||
@@ -53,6 +53,7 @@ impl Stream for NostrStream {
|
|||||||
fn poll_next(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Option<Self::Item>> {
|
fn poll_next(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Option<Self::Item>> {
|
||||||
/// Convert Message to NostrMessage
|
/// Convert Message to NostrMessage
|
||||||
fn convert(msg: String) -> Result<NostrMessage> {
|
fn convert(msg: String) -> Result<NostrMessage> {
|
||||||
|
debug!("raw msg: {}", msg);
|
||||||
let parsed_res: Result<NostrMessage> = serde_json::from_str(&msg).map_err(|e| e.into());
|
let parsed_res: Result<NostrMessage> = serde_json::from_str(&msg).map_err(|e| e.into());
|
||||||
match parsed_res {
|
match parsed_res {
|
||||||
Ok(m) => Ok(m),
|
Ok(m) => Ok(m),
|
||||||
|
|||||||
+2
-1
@@ -16,7 +16,6 @@ pub struct Subscription {
|
|||||||
/// element can be present if it should be used in filtering, or
|
/// element can be present if it should be used in filtering, or
|
||||||
/// absent ([`None`]) if it should be ignored.
|
/// absent ([`None`]) if it should be ignored.
|
||||||
#[derive(Serialize, Deserialize, PartialEq, Debug, Clone)]
|
#[derive(Serialize, Deserialize, PartialEq, Debug, Clone)]
|
||||||
#[serde(deny_unknown_fields)]
|
|
||||||
pub struct ReqFilter {
|
pub struct ReqFilter {
|
||||||
/// Event hash
|
/// Event hash
|
||||||
pub id: Option<String>,
|
pub id: Option<String>,
|
||||||
@@ -30,6 +29,8 @@ pub struct ReqFilter {
|
|||||||
pub pubkey: Option<String>,
|
pub pubkey: Option<String>,
|
||||||
/// Events published after this time
|
/// Events published after this time
|
||||||
pub since: Option<u64>,
|
pub since: Option<u64>,
|
||||||
|
/// Events published before this time
|
||||||
|
pub until: Option<u64>,
|
||||||
/// List of author public keys
|
/// List of author public keys
|
||||||
pub authors: Option<Vec<String>>,
|
pub authors: Option<Vec<String>>,
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user