pub struct Welcome {
pub proto: u32,
pub link: String,
pub card: RuntimeCard,
pub nonce: String,
pub ts: u64,
pub marks: Marks,
pub heartbeat_seconds: u64,
pub expiry_seconds: u64,
}Expand description
An answerer’s welcome: the mirror of the hello, plus the two things that make the link usable. The link id is what the dialer syncs under afterwards, and the marks let the very first sync carry exactly the events the answerer lacks instead of a round spent discovering that. The echoed nonce is what binds this welcome to that hello: without it, a welcome kept from an earlier exchange would answer a hello it never saw.
use std::collections::BTreeMap;
use majordomus_cli::mesh::identity::NodeIdentity;
use majordomus_cli::mesh::link::{fresh_token, sign, verify_signed, Domain, RuntimeCard,
Welcome, LINK_PROTOCOL_MAX};
let node = NodeIdentity::ephemeral().unwrap();
let nonce = fresh_token();
let welcome = Welcome {
proto: LINK_PROTOCOL_MAX,
link: fresh_token(),
card: RuntimeCard {
pk: node.public.public_key.clone(),
runtime: "00000000000000aa".into(),
instance: node.public.instance_id.as_str().into(),
repo: "r".repeat(32),
name: String::new(),
version: String::new(),
features: vec![],
endpoints: vec![],
},
nonce: nonce.clone(),
ts: 1_700_000_000,
marks: BTreeMap::new(),
heartbeat_seconds: 5,
expiry_seconds: 30,
};
assert_eq!(welcome.nonce, nonce, "this welcome answers that hello and no other");
assert!(welcome.marks.is_empty(), "a runtime that has written nothing has nothing to mark");
let signed = sign(&node, Domain::Welcome, serde_json::to_value(&welcome).unwrap());
assert!(verify_signed(&node.public.public_key, Domain::Welcome, &signed));Fields§
§proto: u32The negotiated protocol version.
link: StringThe link id the dialer syncs under.
card: RuntimeCardThe answerer.
nonce: StringThe hello’s nonce, echoed: this welcome answers that hello and no other.
ts: u64The answerer’s clock.
marks: MarksThe answerer’s marks, so the first sync carries exactly what it lacks.
heartbeat_seconds: u64The answerer’s heartbeat, informational.
expiry_seconds: u64The answerer’s expiry, informational.
Trait Implementations§
Source§impl<'de> Deserialize<'de> for Welcome
impl<'de> Deserialize<'de> for Welcome
Source§fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
Deserialize this value from the given Serde deserializer. Read more
Source§impl JsonSchema for Welcome
impl JsonSchema for Welcome
Source§fn schema_id() -> Cow<'static, str>
fn schema_id() -> Cow<'static, str>
Returns a string that uniquely identifies the schema produced by this type. Read more
Source§fn json_schema(generator: &mut SchemaGenerator) -> Schema
fn json_schema(generator: &mut SchemaGenerator) -> Schema
Generates a JSON Schema for this type. Read more
Source§fn inline_schema() -> bool
fn inline_schema() -> bool
Whether JSON Schemas generated for this type should be included directly in parent schemas,
rather than being re-used where possible using the
$ref keyword. Read moreimpl StructuralPartialEq for Welcome
Auto Trait Implementations§
impl Freeze for Welcome
impl RefUnwindSafe for Welcome
impl Send for Welcome
impl Sync for Welcome
impl Unpin for Welcome
impl UnsafeUnpin for Welcome
impl UnwindSafe for Welcome
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more