Struct rings_core::message::MessagePayload
source · pub struct MessagePayload<T> {
pub data: T,
pub tx_id: Uuid,
pub addr: Did,
pub verification: MessageVerification,
pub origin_verification: MessageVerification,
pub relay: MessageRelay,
}Expand description
MessagePayload with sequence and verification, contain MessageRelay.
Fields§
§data: T§tx_id: Uuid§addr: Did§verification: MessageVerification§origin_verification: MessageVerification§relay: MessageRelayImplementations§
source§impl<T> MessagePayload<T>where
T: Serialize + DeserializeOwned,
impl<T> MessagePayload<T>where
T: Serialize + DeserializeOwned,
sourcepub fn new(
data: T,
session_manager: &SessionManager,
origin_verification_gen: OriginVerificationGen,
relay: MessageRelay
) -> Result<Self>
pub fn new(
data: T,
session_manager: &SessionManager,
origin_verification_gen: OriginVerificationGen,
relay: MessageRelay
) -> Result<Self>
Examples found in repository?
src/message/payload.rs (line 122)
109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264
pub fn new_send(
data: T,
session_manager: &SessionManager,
next_hop: Did,
destination: Did,
) -> Result<Self> {
let relay = MessageRelay::new(
RelayMethod::SEND,
vec![session_manager.authorizer()?],
None,
Some(next_hop),
destination,
);
Self::new(data, session_manager, OriginVerificationGen::Origin, relay)
}
pub fn new_report(
data: T,
tx_id: uuid::Uuid,
session_manager: &SessionManager,
relay: &MessageRelay,
) -> Result<Self> {
let relay = relay.report()?;
let mut pl = Self::new(data, session_manager, OriginVerificationGen::Origin, relay)?;
pl.tx_id = tx_id;
Ok(pl)
}
/// new_direct is A specific new_send, with same next_hop and destination
/// just like a normal server-client base model.
pub fn new_direct(data: T, session_manager: &SessionManager, destination: Did) -> Result<Self> {
Self::new_send(data, session_manager, destination, destination)
}
pub fn is_expired(&self) -> bool {
if self.verification.ttl_ms > MAX_TTL_MS {
return false;
}
if self.origin_verification.ttl_ms > MAX_TTL_MS {
return false;
}
let now = get_epoch_ms();
if self.verification.ts_ms - TS_OFFSET_TOLERANCE_MS > now {
return false;
}
if self.origin_verification.ts_ms - TS_OFFSET_TOLERANCE_MS > now {
return false;
}
now > self.verification.ts_ms + self.verification.ttl_ms as u128
&& now > self.origin_verification.ts_ms + self.origin_verification.ttl_ms as u128
}
pub fn verify(&self) -> bool {
tracing::debug!("verifying payload: {:?}", self.tx_id);
if self.is_expired() {
tracing::warn!("message expired");
return false;
}
self.verification.verify(&self.data) && self.origin_verification.verify(&self.data)
}
pub fn origin_session_pubkey(&self) -> Result<PublicKey> {
self.origin_verification.session_pubkey(&self.data)
}
pub fn from_bincode(data: &[u8]) -> Result<Self> {
bincode::deserialize(data).map_err(Error::BincodeDeserialize)
}
pub fn to_bincode(&self) -> Result<Bytes> {
bincode::serialize(self)
.map(Bytes::from)
.map_err(Error::BincodeSerialize)
}
}
impl<T> Encoder for MessagePayload<T>
where T: Serialize + DeserializeOwned
{
fn encode(&self) -> Result<Encoded> {
self.to_bincode()?.encode()
}
}
impl<T> Decoder for MessagePayload<T>
where T: Serialize + DeserializeOwned
{
fn from_encoded(encoded: &Encoded) -> Result<Self> {
let v: Bytes = encoded.decode()?;
Self::from_bincode(&v)
}
}
#[cfg_attr(feature = "wasm", async_trait(?Send))]
#[cfg_attr(not(feature = "wasm"), async_trait)]
pub trait PayloadSender<T>
where T: Clone + Serialize + DeserializeOwned + Send + Sync + 'static
{
fn session_manager(&self) -> &SessionManager;
async fn do_send_payload(&self, did: Did, payload: MessagePayload<T>) -> Result<()>;
async fn send_payload(&self, payload: MessagePayload<T>) -> Result<()> {
if let Some(did) = payload.relay.next_hop {
self.do_send_payload(did, payload).await
} else {
Err(Error::NoNextHop)
}
}
async fn send_message(&self, msg: T, next_hop: Did, destination: Did) -> Result<uuid::Uuid> {
let payload = MessagePayload::new_send(msg, self.session_manager(), next_hop, destination)?;
self.send_payload(payload.clone()).await?;
Ok(payload.tx_id)
}
async fn send_direct_message(&self, msg: T, destination: Did) -> Result<uuid::Uuid> {
let payload = MessagePayload::new_direct(msg, self.session_manager(), destination)?;
self.send_payload(payload.clone()).await?;
Ok(payload.tx_id)
}
async fn send_report_message(
&self,
msg: T,
tx_id: uuid::Uuid,
relay: MessageRelay,
) -> Result<()> {
self.send_payload(MessagePayload::new_report(
msg,
tx_id,
self.session_manager(),
&relay,
)?)
.await
}
async fn forward_payload(
&self,
payload: &MessagePayload<T>,
relay: MessageRelay,
) -> Result<()> {
self.send_payload(MessagePayload::new(
payload.data.clone(),
self.session_manager(),
OriginVerificationGen::Stick(payload.origin_verification.clone()),
relay,
)?)
.await
}More examples
src/message/handlers/mod.rs (lines 184-189)
159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207
pub async fn handle_payload(&self, payload: &MessagePayload<Message>) -> Result<()> {
#[cfg(test)]
{
println!("{} got msg {}", self.swarm.did(), &payload.data);
}
tracing::debug!("START HANDLE MESSAGE: {} {}", &payload.tx_id, &payload.data);
self.validate(payload).await?;
match &payload.data {
Message::JoinDHT(ref msg) => self.handle(payload, msg).await,
Message::LeaveDHT(ref msg) => self.handle(payload, msg).await,
Message::ConnectNodeSend(ref msg) => self.handle(payload, msg).await,
Message::ConnectNodeReport(ref msg) => self.handle(payload, msg).await,
Message::AlreadyConnected(ref msg) => self.handle(payload, msg).await,
Message::FindSuccessorSend(ref msg) => self.handle(payload, msg).await,
Message::FindSuccessorReport(ref msg) => self.handle(payload, msg).await,
Message::NotifyPredecessorSend(ref msg) => self.handle(payload, msg).await,
Message::NotifyPredecessorReport(ref msg) => self.handle(payload, msg).await,
Message::SearchVNode(ref msg) => self.handle(payload, msg).await,
Message::FoundVNode(ref msg) => self.handle(payload, msg).await,
Message::StoreVNode(ref msg) => self.handle(payload, msg).await,
Message::CustomMessage(ref msg) => self.handle(payload, msg).await,
Message::MultiCall(ref msg) => {
for message in msg.messages.iter().cloned() {
let payload = MessagePayload::new(
message,
self.swarm.session_manager(),
OriginVerificationGen::Stick(payload.origin_verification.clone()),
payload.relay.clone(),
)?;
self.handle_payload(&payload).await.unwrap_or(());
}
Ok(())
}
x => Err(Error::MessageHandlerUnsupportedMessageType(format!(
"{:?}",
x
))),
}?;
tracing::debug!("INVOKE CALLBACK {}", &payload.tx_id);
if let Err(e) = self.invoke_callback(payload).await {
tracing::warn!("invoke callback error: {}", e);
}
tracing::debug!("FINISH HANDLE MESSAGE {}", &payload.tx_id);
Ok(())
}sourcepub fn new_send(
data: T,
session_manager: &SessionManager,
next_hop: Did,
destination: Did
) -> Result<Self>
pub fn new_send(
data: T,
session_manager: &SessionManager,
next_hop: Did,
destination: Did
) -> Result<Self>
Examples found in repository?
src/message/payload.rs (line 140)
139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229
pub fn new_direct(data: T, session_manager: &SessionManager, destination: Did) -> Result<Self> {
Self::new_send(data, session_manager, destination, destination)
}
pub fn is_expired(&self) -> bool {
if self.verification.ttl_ms > MAX_TTL_MS {
return false;
}
if self.origin_verification.ttl_ms > MAX_TTL_MS {
return false;
}
let now = get_epoch_ms();
if self.verification.ts_ms - TS_OFFSET_TOLERANCE_MS > now {
return false;
}
if self.origin_verification.ts_ms - TS_OFFSET_TOLERANCE_MS > now {
return false;
}
now > self.verification.ts_ms + self.verification.ttl_ms as u128
&& now > self.origin_verification.ts_ms + self.origin_verification.ttl_ms as u128
}
pub fn verify(&self) -> bool {
tracing::debug!("verifying payload: {:?}", self.tx_id);
if self.is_expired() {
tracing::warn!("message expired");
return false;
}
self.verification.verify(&self.data) && self.origin_verification.verify(&self.data)
}
pub fn origin_session_pubkey(&self) -> Result<PublicKey> {
self.origin_verification.session_pubkey(&self.data)
}
pub fn from_bincode(data: &[u8]) -> Result<Self> {
bincode::deserialize(data).map_err(Error::BincodeDeserialize)
}
pub fn to_bincode(&self) -> Result<Bytes> {
bincode::serialize(self)
.map(Bytes::from)
.map_err(Error::BincodeSerialize)
}
}
impl<T> Encoder for MessagePayload<T>
where T: Serialize + DeserializeOwned
{
fn encode(&self) -> Result<Encoded> {
self.to_bincode()?.encode()
}
}
impl<T> Decoder for MessagePayload<T>
where T: Serialize + DeserializeOwned
{
fn from_encoded(encoded: &Encoded) -> Result<Self> {
let v: Bytes = encoded.decode()?;
Self::from_bincode(&v)
}
}
#[cfg_attr(feature = "wasm", async_trait(?Send))]
#[cfg_attr(not(feature = "wasm"), async_trait)]
pub trait PayloadSender<T>
where T: Clone + Serialize + DeserializeOwned + Send + Sync + 'static
{
fn session_manager(&self) -> &SessionManager;
async fn do_send_payload(&self, did: Did, payload: MessagePayload<T>) -> Result<()>;
async fn send_payload(&self, payload: MessagePayload<T>) -> Result<()> {
if let Some(did) = payload.relay.next_hop {
self.do_send_payload(did, payload).await
} else {
Err(Error::NoNextHop)
}
}
async fn send_message(&self, msg: T, next_hop: Did, destination: Did) -> Result<uuid::Uuid> {
let payload = MessagePayload::new_send(msg, self.session_manager(), next_hop, destination)?;
self.send_payload(payload.clone()).await?;
Ok(payload.tx_id)
}sourcepub fn new_report(
data: T,
tx_id: Uuid,
session_manager: &SessionManager,
relay: &MessageRelay
) -> Result<Self>
pub fn new_report(
data: T,
tx_id: Uuid,
session_manager: &SessionManager,
relay: &MessageRelay
) -> Result<Self>
Examples found in repository?
src/message/payload.rs (lines 243-248)
237 238 239 240 241 242 243 244 245 246 247 248 249 250
async fn send_report_message(
&self,
msg: T,
tx_id: uuid::Uuid,
relay: MessageRelay,
) -> Result<()> {
self.send_payload(MessagePayload::new_report(
msg,
tx_id,
self.session_manager(),
&relay,
)?)
.await
}sourcepub fn new_direct(
data: T,
session_manager: &SessionManager,
destination: Did
) -> Result<Self>
pub fn new_direct(
data: T,
session_manager: &SessionManager,
destination: Did
) -> Result<Self>
new_direct is A specific new_send, with same next_hop and destination just like a normal server-client base model.
Examples found in repository?
More examples
src/transports/default/transport.rs (lines 479-483)
446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485
async fn get_handshake_info(
&self,
session_manager: &SessionManager,
kind: RTCSdpType,
services: HashSet<PeerService>,
) -> Result<Encoded> {
tracing::trace!("prepareing handshake info {:?}", kind);
let sdp = match kind {
RTCSdpType::Answer => self.get_answer().await?,
RTCSdpType::Offer => self.get_offer().await?,
kind => {
let mut sdp = self.get_offer().await?;
sdp.sdp_type = kind;
sdp
}
};
let local_candidates_json = join_all(
self.pending_candidates
.lock()
.await
.iter()
.map(async move |c| c.clone().to_json().unwrap().into()),
)
.await;
if local_candidates_json.is_empty() {
return Err(Error::FailedOnGatherLocalCandidate);
}
let data = TricklePayload {
sdp: serde_json::to_string(&sdp).unwrap(),
candidates: local_candidates_json,
services: services.into_iter().collect_vec(),
};
tracing::trace!("prepared handshake info :{:?}", data);
let resp = MessagePayload::new_direct(
data,
session_manager,
session_manager.authorizer()?.to_owned(), // This is a fake destination
)?;
Ok(resp.encode()?)
}src/swarm.rs (lines 200-207)
178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236
async fn load_message(
&self,
ev: Result<Option<Event>>,
) -> Result<Option<MessagePayload<Message>>> {
let ev = ev?;
match ev {
Some(Event::DataChannelMessage(msg)) => {
let payload = MessagePayload::from_bincode(&msg)?;
tracing::debug!("load message from channel: {:?}", payload);
Ok(Some(payload))
}
Some(Event::RegisterTransport((did, id))) => {
// if transport is still pending
if let Ok(Some(t)) = self.find_pending_transport(id) {
tracing::debug!("transport is inside pending list, mov to swarm transports");
self.register(did, t).await?;
self.pop_pending_transport(id)?;
}
match self.get_transport(did) {
Some(trans) => {
let payload = MessagePayload::new_direct(
Message::JoinDHT(message::JoinDHT {
did,
services: trans.services().await.into_iter().collect(),
}),
&self.session_manager,
self.dht.did,
)?;
Ok(Some(payload))
}
None => Err(Error::SwarmMissTransport(did)),
}
}
Some(Event::ConnectClosed((did, uuid))) => {
if self.pop_pending_transport(uuid).is_ok() {
tracing::info!(
"[Swarm::ConnectClosed] Pending transport {:?} dropped",
uuid
);
};
if let Some(t) = self.get_transport(did) {
if t.id == uuid && self.remove_transport(did).is_some() {
tracing::info!("[Swarm::ConnectClosed] transport {:?} closed", uuid);
let payload = MessagePayload::new_direct(
Message::LeaveDHT(message::LeaveDHT { did }),
&self.session_manager,
self.dht.did,
)?;
return Ok(Some(payload));
}
}
Ok(None)
}
None => Ok(None),
}
}sourcepub fn is_expired(&self) -> bool
pub fn is_expired(&self) -> bool
sourcepub fn verify(&self) -> bool
pub fn verify(&self) -> bool
Examples found in repository?
src/message/handlers/mod.rs (line 213)
211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268
pub async fn listen_once(&self) -> Option<MessagePayload<Message>> {
if let Some(payload) = self.swarm.poll_message().await {
if !payload.verify() {
tracing::error!("Cannot verify msg or it's expired: {:?}", payload);
}
if let Err(e) = self.handle_payload(&payload).await {
tracing::error!("Error in handle_message: {}", e);
#[cfg(test)]
{
println!("Error in handle_message: {}", e);
}
}
Some(payload)
} else {
None
}
}
}
#[cfg_attr(feature = "wasm", async_trait(?Send))]
#[cfg_attr(not(feature = "wasm"), async_trait)]
impl PayloadSender<Message> for MessageHandler {
fn session_manager(&self) -> &SessionManager {
self.swarm.session_manager()
}
async fn do_send_payload(&self, did: Did, payload: MessagePayload<Message>) -> Result<()> {
self.swarm.do_send_payload(did, payload).await
}
}
#[cfg(not(feature = "wasm"))]
mod listener {
use std::sync::Arc;
use async_trait::async_trait;
use futures::pin_mut;
use futures::stream::StreamExt;
use super::MessageHandler;
use crate::types::message::MessageListener;
#[async_trait]
impl MessageListener for MessageHandler {
async fn listen(self: Arc<Self>) {
let payloads = self.swarm.iter_messages().await;
pin_mut!(payloads);
while let Some(payload) = payloads.next().await {
if !payload.verify() {
tracing::error!("Cannot verify msg or it's expired: {:?}", payload);
continue;
}
if let Err(e) = self.handle_payload(&payload).await {
tracing::error!("Error in handle_message: {}", e);
continue;
}
}
}More examples
src/transports/default/transport.rs (line 490)
487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518
async fn register_remote_info(&self, data: Encoded) -> Result<Did> {
let data: MessagePayload<TricklePayload> = data.decode()?;
tracing::trace!("register remote info: {:?}", data);
match data.verify() {
true => {
let sdp = serde_json::from_str::<RTCSessionDescription>(&data.data.sdp)
.map_err(Error::Deserialize)?;
tracing::trace!("setting remote sdp: {:?}", sdp);
self.set_remote_description(sdp).await?;
tracing::trace!("setting remote candidate");
for c in &data.data.candidates {
tracing::trace!("add candidates: {:?}", c);
if self.add_ice_candidate(c.clone()).await.is_err() {
tracing::warn!("failed on add add candidates: {:?}", c.clone());
};
}
if let Ok(public_key) = data.origin_verification.session.authorizer_pubkey() {
let mut pk = self.public_key.write().await;
*pk = Some(public_key);
};
{
let mut services = self.services.write().await;
*services = data.data.services.into_iter().collect();
}
Ok(data.addr)
}
_ => {
tracing::error!("cannot verify message sig");
return Err(Error::VerifySignatureFailed);
}
}
}pub fn origin_session_pubkey(&self) -> Result<PublicKey>
sourcepub fn from_bincode(data: &[u8]) -> Result<Self>
pub fn from_bincode(data: &[u8]) -> Result<Self>
Examples found in repository?
More examples
src/swarm.rs (line 186)
178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236
async fn load_message(
&self,
ev: Result<Option<Event>>,
) -> Result<Option<MessagePayload<Message>>> {
let ev = ev?;
match ev {
Some(Event::DataChannelMessage(msg)) => {
let payload = MessagePayload::from_bincode(&msg)?;
tracing::debug!("load message from channel: {:?}", payload);
Ok(Some(payload))
}
Some(Event::RegisterTransport((did, id))) => {
// if transport is still pending
if let Ok(Some(t)) = self.find_pending_transport(id) {
tracing::debug!("transport is inside pending list, mov to swarm transports");
self.register(did, t).await?;
self.pop_pending_transport(id)?;
}
match self.get_transport(did) {
Some(trans) => {
let payload = MessagePayload::new_direct(
Message::JoinDHT(message::JoinDHT {
did,
services: trans.services().await.into_iter().collect(),
}),
&self.session_manager,
self.dht.did,
)?;
Ok(Some(payload))
}
None => Err(Error::SwarmMissTransport(did)),
}
}
Some(Event::ConnectClosed((did, uuid))) => {
if self.pop_pending_transport(uuid).is_ok() {
tracing::info!(
"[Swarm::ConnectClosed] Pending transport {:?} dropped",
uuid
);
};
if let Some(t) = self.get_transport(did) {
if t.id == uuid && self.remove_transport(did).is_some() {
tracing::info!("[Swarm::ConnectClosed] transport {:?} closed", uuid);
let payload = MessagePayload::new_direct(
Message::LeaveDHT(message::LeaveDHT { did }),
&self.session_manager,
self.dht.did,
)?;
return Ok(Some(payload));
}
}
Ok(None)
}
None => Ok(None),
}
}sourcepub fn to_bincode(&self) -> Result<Bytes>
pub fn to_bincode(&self) -> Result<Bytes>
Examples found in repository?
More examples
src/swarm.rs (line 369)
350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373
async fn do_send_payload(&self, did: Did, payload: MessagePayload<T>) -> Result<()> {
#[cfg(test)]
{
println!("+++++++++++++++++++++++++++++++++");
println!("node {:?}", self.dht.did);
println!("Sent {:?}", payload.clone());
println!("node {:?}", payload.relay.next_hop);
println!("+++++++++++++++++++++++++++++++++");
}
let transport = self
.get_and_check_transport(did)
.await
.ok_or(Error::SwarmMissDidInTable(did))?;
tracing::trace!(
"SENT {:?}, to node {:?} via transport {:?}",
payload.clone(),
payload.relay.next_hop,
transport.id
);
let data = payload.to_bincode()?;
tracing::info!("send data len: {}", data.len());
transport.wait_for_data_channel_open().await?;
transport.send_message(&data).await
}Trait Implementations§
source§impl<T: Clone> Clone for MessagePayload<T>
impl<T: Clone> Clone for MessagePayload<T>
source§fn clone(&self) -> MessagePayload<T>
fn clone(&self) -> MessagePayload<T>
Returns a copy of the value. Read more
1.0.0 · source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
Performs copy-assignment from
source. Read moresource§impl<T: Debug> Debug for MessagePayload<T>
impl<T: Debug> Debug for MessagePayload<T>
source§impl<T> Decoder for MessagePayload<T>where
T: Serialize + DeserializeOwned,
impl<T> Decoder for MessagePayload<T>where
T: Serialize + DeserializeOwned,
fn from_encoded(encoded: &Encoded) -> Result<Self>
source§impl<'de, T> Deserialize<'de> for MessagePayload<T>where
T: Deserialize<'de>,
impl<'de, T> Deserialize<'de> for MessagePayload<T>where
T: Deserialize<'de>,
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<T> Encoder for MessagePayload<T>where
T: Serialize + DeserializeOwned,
impl<T> Encoder for MessagePayload<T>where
T: Serialize + DeserializeOwned,
source§impl<T: PartialEq> PartialEq<MessagePayload<T>> for MessagePayload<T>
impl<T: PartialEq> PartialEq<MessagePayload<T>> for MessagePayload<T>
source§fn eq(&self, other: &MessagePayload<T>) -> bool
fn eq(&self, other: &MessagePayload<T>) -> bool
This method tests for
self and other values to be equal, and is used
by ==.source§impl<T> Serialize for MessagePayload<T>where
T: Serialize,
impl<T> Serialize for MessagePayload<T>where
T: Serialize,
source§impl<T> TryFrom<MessagePayload<T>> for VirtualNodewhere
T: Serialize + DeserializeOwned,
impl<T> TryFrom<MessagePayload<T>> for VirtualNodewhere
T: Serialize + DeserializeOwned,
impl<T: Eq> Eq for MessagePayload<T>
impl<T> StructuralEq for MessagePayload<T>
impl<T> StructuralPartialEq for MessagePayload<T>
Auto Trait Implementations§
impl<T> RefUnwindSafe for MessagePayload<T>where
T: RefUnwindSafe,
impl<T> Send for MessagePayload<T>where
T: Send,
impl<T> Sync for MessagePayload<T>where
T: Sync,
impl<T> Unpin for MessagePayload<T>where
T: Unpin,
impl<T> UnwindSafe for MessagePayload<T>where
T: UnwindSafe,
Blanket Implementations§
§impl<'a, T, E> AsTaggedExplicit<'a, E> for Twhere
T: 'a,
impl<'a, T, E> AsTaggedExplicit<'a, E> for Twhere
T: 'a,
§impl<'a, T> AsTaggedExplicit<'a> for Twhere
T: 'a,
impl<'a, T> AsTaggedExplicit<'a> for Twhere
T: 'a,
§impl<'a, T, E> AsTaggedImplicit<'a, E> for Twhere
T: 'a,
impl<'a, T, E> AsTaggedImplicit<'a, E> for Twhere
T: 'a,
§impl<'a, T> AsTaggedImplicit<'a> for Twhere
T: 'a,
impl<'a, T> AsTaggedImplicit<'a> for Twhere
T: 'a,
source§impl<Q, K> Equivalent<K> for Qwhere
Q: Eq + ?Sized,
K: Borrow<Q> + ?Sized,
impl<Q, K> Equivalent<K> for Qwhere
Q: Eq + ?Sized,
K: Borrow<Q> + ?Sized,
source§fn equivalent(&self, key: &K) -> bool
fn equivalent(&self, key: &K) -> bool
Compare self to
key and return true if they are equal.