pub mod lan;
pub mod nostr;
use crate::config::UdpConfig;
use crate::{NodeAddr, TransportId};
use std::net::{SocketAddr, UdpSocket};
pub const PUNCH_MAGIC: u32 = 0x4E505443;
pub const PUNCH_ACK_MAGIC: u32 = 0x4E505441;
pub fn is_punch_packet(data: &[u8]) -> bool {
if data.len() < 4 {
return false;
}
let magic = u32::from_be_bytes([data[0], data[1], data[2], data[3]]);
magic == PUNCH_MAGIC || magic == PUNCH_ACK_MAGIC
}
#[derive(Debug, Clone)]
pub struct BootstrapHandoffResult {
pub transport_id: TransportId,
pub local_addr: SocketAddr,
pub remote_addr: SocketAddr,
pub peer_node_addr: NodeAddr,
pub session_id: String,
}
#[derive(Debug)]
pub struct EstablishedTraversal {
pub session_id: String,
pub peer_npub: String,
pub remote_addr: SocketAddr,
pub socket: UdpSocket,
pub transport_name: Option<String>,
pub transport_config: Option<UdpConfig>,
}
impl EstablishedTraversal {
pub fn new(
session_id: impl Into<String>,
peer_npub: impl Into<String>,
remote_addr: SocketAddr,
socket: UdpSocket,
) -> Self {
Self {
session_id: session_id.into(),
peer_npub: peer_npub.into(),
remote_addr,
socket,
transport_name: None,
transport_config: None,
}
}
pub fn with_transport_name(mut self, name: impl Into<String>) -> Self {
self.transport_name = Some(name.into());
self
}
pub fn with_transport_config(mut self, config: UdpConfig) -> Self {
self.transport_config = Some(config);
self
}
}