1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
// This file is part of Soil.
// Copyright (C) Soil contributors.
// Copyright (C) Parity Technologies (UK) Ltd.
// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0
//! Network event types. These are not the part of the protocol, but rather
//! events that happen on the network like DHT get/put results received.
use crate::types::ProtocolName;
use bytes::Bytes;
use crate::common::role::ObservedRole;
use crate::types::{
kad::{Key, PeerRecord},
multiaddr::Multiaddr,
PeerId,
};
/// Events generated by DHT as a response to get_value and put_value requests.
#[derive(Debug, Clone)]
#[must_use]
pub enum DhtEvent {
/// Found closest peers to the target `PeerId`. With libp2p also delivers a partial result
/// in case the query timed out, because it can contain the target peer's address.
ClosestPeersFound(PeerId, Vec<(PeerId, Vec<Multiaddr>)>),
/// Closest peers to the target `PeerId` has not been found.
ClosestPeersNotFound(PeerId),
/// The value was found.
ValueFound(PeerRecord),
/// The requested record has not been found in the DHT.
ValueNotFound(Key),
/// The record has been successfully inserted into the DHT.
ValuePut(Key),
/// An error has occurred while putting a record into the DHT.
ValuePutFailed(Key),
/// Successfully started providing the given key.
StartedProviding(Key),
/// An error occured while registering as a content provider on the DHT.
StartProvidingFailed(Key),
/// The DHT received a put record request.
PutRecordRequest(Key, Vec<u8>, Option<PeerId>, Option<std::time::Instant>),
/// The providers for [`Key`] were found. Multiple such events can be generated per provider
/// discovery request.
ProvidersFound(Key, Vec<PeerId>),
/// `GET_PROVIDERS` query finished and won't yield any more providers.
NoMoreProviders(Key),
/// `GET_PROVIDERS` query failed and no providers for [`Key`] were found. libp2p also emits
/// this event after already yielding some results via [`DhtEvent::ProvidersFound`].
ProvidersNotFound(Key),
}
/// Type for events generated by networking layer.
#[derive(Debug, Clone)]
#[must_use]
pub enum Event {
/// Event generated by a DHT.
Dht(DhtEvent),
/// Opened a substream with the given node with the given notifications protocol.
///
/// The protocol is always one of the notification protocols that have been registered.
NotificationStreamOpened {
/// Node we opened the substream with.
remote: PeerId,
/// The concerned protocol. Each protocol uses a different substream.
/// This is always equal to the value of
/// `soil_network::config::NonDefaultSetConfig::notifications_protocol` of one of the
/// configured sets.
protocol: ProtocolName,
/// If the negotiation didn't use the main name of the protocol (the one in
/// `notifications_protocol`), then this field contains which name has actually been
/// used.
/// Always contains a value equal to the value in
/// `soil_network::config::NonDefaultSetConfig::fallback_names`.
negotiated_fallback: Option<ProtocolName>,
/// Role of the remote.
role: ObservedRole,
/// Received handshake.
received_handshake: Vec<u8>,
},
/// Closed a substream with the given node. Always matches a corresponding previous
/// `NotificationStreamOpened` message.
NotificationStreamClosed {
/// Node we closed the substream with.
remote: PeerId,
/// The concerned protocol. Each protocol uses a different substream.
protocol: ProtocolName,
},
/// Received one or more messages from the given node using the given protocol.
NotificationsReceived {
/// Node we received the message from.
remote: PeerId,
/// Concerned protocol and associated message.
messages: Vec<(ProtocolName, Bytes)>,
},
}