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
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
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
use bytes::Bytes;
use cid::Cid;
use derive_more::{From, TryInto};
use libp2p::{Multiaddr, PeerId};
use quic_rpc::{
message::{Msg, RpcMsg, ServerStreaming},
Service,
};
use serde::{Deserialize, Serialize};
use std::collections::BTreeMap;
use crate::{RpcResult, VersionRequest, VersionResponse, WatchRequest, WatchResponse};
pub type P2pAddr = super::addr::Addr<P2pService>;
#[derive(Serialize, Deserialize, Debug)]
pub struct Key(pub Bytes);
#[derive(Serialize, Deserialize, Debug)]
pub struct LocalPeerIdRequest;
#[derive(Serialize, Deserialize, Debug)]
pub struct LocalPeerIdResponse {
pub peer_id: PeerId,
}
#[derive(Serialize, Deserialize, Debug)]
pub struct ExternalAddrsRequest;
#[derive(Serialize, Deserialize, Debug)]
pub struct ExternalAddrsResponse {
pub addrs: Vec<Multiaddr>,
}
#[derive(Serialize, Deserialize, Debug)]
pub struct ListenersRequest;
#[derive(Serialize, Deserialize, Debug)]
pub struct ListenersResponse {
pub addrs: Vec<Multiaddr>,
}
#[derive(Serialize, Deserialize, Debug)]
pub struct BitswapRequest {
pub cid: Cid,
pub providers: Vec<PeerId>,
pub ctx: u64,
}
#[derive(Serialize, Deserialize, Debug)]
pub struct BitswapResponse {
pub data: Bytes,
pub ctx: u64,
}
#[derive(Serialize, Deserialize, Debug)]
pub struct FetchProvidersDhtRequest {
pub key: Key,
}
#[derive(Serialize, Deserialize, Debug)]
pub struct FetchProvidersDhtResponse {
pub providers: Vec<PeerId>,
}
#[derive(Serialize, Deserialize, Debug)]
pub struct NotifyNewBlocksBitswapRequest {
pub blocks: Vec<BitswapBlock>,
}
#[derive(Serialize, Deserialize, Debug)]
pub struct BitswapBlock {
pub cid: Cid,
pub data: Bytes,
}
#[derive(Serialize, Deserialize, Debug)]
pub struct StopSessionBitswapRequest {
pub ctx: u64,
}
#[derive(Serialize, Deserialize, Debug)]
pub struct StartProvidingRequest {
pub key: Key,
}
#[derive(Serialize, Deserialize, Debug)]
pub struct StopProvidingRequest {
pub key: Key,
}
#[derive(Serialize, Deserialize, Debug)]
pub struct GetListeningAddrsRequest;
#[derive(Serialize, Deserialize, Debug)]
pub struct GetListeningAddrsResponse {
pub peer_id: PeerId,
pub addrs: Vec<Multiaddr>,
}
#[derive(Serialize, Deserialize, Debug)]
pub struct GetPeersRequest;
#[derive(Serialize, Deserialize, Debug)]
pub struct GetPeersResponse {
pub peers: BTreeMap<PeerId, Vec<Multiaddr>>,
}
#[derive(Serialize, Deserialize, Debug)]
pub struct ConnectRequest {
pub peer_id: PeerId,
pub addrs: Vec<Multiaddr>,
}
#[derive(Serialize, Deserialize, Debug)]
pub struct ConnectByPeerIdRequest {
pub peer_id: PeerId,
}
#[derive(Serialize, Deserialize, Debug)]
pub struct DisconnectRequest {
pub peer_id: PeerId,
}
#[derive(Serialize, Deserialize, Debug)]
pub struct ShutdownRequest;
#[derive(Serialize, Deserialize, Debug)]
pub struct LookupRequest {
pub peer_id: PeerId,
pub addr: Option<Multiaddr>,
}
#[derive(Serialize, Deserialize, Debug)]
pub struct LookupLocalRequest;
#[derive(Serialize, Deserialize, Debug)]
pub struct LookupResponse {
pub peer_id: PeerId,
pub protocol_version: String,
pub agent_version: String,
pub listen_addrs: Vec<Multiaddr>,
pub protocols: Vec<String>,
pub observed_addrs: Vec<Multiaddr>,
}
#[derive(Serialize, Deserialize, Debug)]
pub struct GossipsubAddExplicitPeerRequest {
pub peer_id: PeerId,
}
#[derive(Serialize, Deserialize, Debug)]
pub struct GossipsubAllMeshPeersRequest;
#[derive(Serialize, Deserialize, Debug)]
pub struct GossipsubPeersResponse {
pub peers: Vec<PeerId>,
}
#[derive(Serialize, Deserialize, Debug)]
pub struct GossipsubAllPeersRequest;
#[derive(Serialize, Deserialize, Debug)]
pub struct GossipsubAllPeersResponse {
pub all: Vec<(PeerId, Vec<String>)>,
}
#[derive(Serialize, Deserialize, Debug)]
pub struct GossipsubMeshPeersRequest {
pub topic_hash: String,
}
#[derive(Serialize, Deserialize, Debug)]
pub struct GossipsubPublishRequest {
pub topic_hash: String,
pub data: Bytes,
}
#[derive(Serialize, Deserialize, Debug)]
pub struct GossipsubPublishResponse {
pub message_id: Bytes,
}
#[derive(Serialize, Deserialize, Debug)]
pub struct GossipsubRemoveExplicitPeerRequest {
pub peer_id: PeerId,
}
#[derive(Serialize, Deserialize, Debug)]
pub struct GossipsubSubscribeRequest {
pub topic_hash: String,
}
#[derive(Serialize, Deserialize, Debug)]
pub struct GossipsubSubscribeResponse {
pub was_subscribed: bool,
}
#[derive(Serialize, Deserialize, Debug)]
pub struct GossipsubTopicsRequest;
#[derive(Serialize, Deserialize, Debug)]
pub struct GossipsubTopicsResponse {
pub topics: Vec<String>,
}
#[derive(Serialize, Deserialize, Debug)]
pub struct GossipsubUnsubscribeRequest {
pub topic_hash: String,
}
#[derive(Serialize, Deserialize, Debug)]
pub struct GossipsubUnsubscribeResponse {
pub was_subscribed: bool,
}
#[derive(Serialize, Deserialize, Debug, From, TryInto)]
pub enum P2pRequest {
Watch(WatchRequest),
Version(VersionRequest),
Shutdown(ShutdownRequest),
FetchBitswap(BitswapRequest),
FetchProviderDht(FetchProvidersDhtRequest),
StopSessionBitswap(StopSessionBitswapRequest),
NotifyNewBlocksBitswap(NotifyNewBlocksBitswapRequest),
GetListeningAddrs(GetListeningAddrsRequest),
GetPeers(GetPeersRequest),
PeerConnect(ConnectRequest),
PeerConnectByPeerId(ConnectByPeerIdRequest),
PeerDisconnect(DisconnectRequest),
Lookup(LookupRequest),
LookupLocal(LookupLocalRequest),
GossipsubAddExplicitPeer(GossipsubAddExplicitPeerRequest),
GossipsubAllMeshPeers(GossipsubAllMeshPeersRequest),
GossipsubAllPeers(GossipsubAllPeersRequest),
GossipsubMeshPeers(GossipsubMeshPeersRequest),
GossipsubPublish(GossipsubPublishRequest),
GossipsubRemoveExplicitPeer(GossipsubRemoveExplicitPeerRequest),
GossipsubSubscribe(GossipsubSubscribeRequest),
GossipsubTopics(GossipsubTopicsRequest),
GossipsubUnsubscribe(GossipsubUnsubscribeRequest),
StartProviding(StartProvidingRequest),
StopProviding(StopProvidingRequest),
LocalPeerId(LocalPeerIdRequest),
ExternalAddrs(ExternalAddrsRequest),
Listeners(ListenersRequest),
}
#[derive(Serialize, Deserialize, Debug, From, TryInto)]
pub enum P2pResponse {
Watch(WatchResponse),
Version(VersionResponse),
FetchBitswap(RpcResult<BitswapResponse>),
FetchProviderDht(RpcResult<FetchProvidersDhtResponse>),
GetListeningAddrs(RpcResult<GetListeningAddrsResponse>),
GetPeers(RpcResult<GetPeersResponse>),
Lookup(RpcResult<LookupResponse>),
GossipsubPeers(RpcResult<GossipsubPeersResponse>),
GossipsubAllPeers(RpcResult<GossipsubAllPeersResponse>),
GossipsubPublish(RpcResult<GossipsubPublishResponse>),
GossipsubSubscribe(RpcResult<GossipsubSubscribeResponse>),
GossipsubTopics(RpcResult<GossipsubTopicsResponse>),
GossipsubUnsubscribe(RpcResult<GossipsubUnsubscribeResponse>),
LocalPeerId(RpcResult<LocalPeerIdResponse>),
ExternalAddrs(RpcResult<ExternalAddrsResponse>),
Listeners(RpcResult<ListenersResponse>),
UnitResult(RpcResult<()>),
}
#[derive(Debug, Clone)]
pub struct P2pService;
impl Service for P2pService {
type Req = P2pRequest;
type Res = P2pResponse;
}
impl Msg<P2pService> for WatchRequest {
type Response = WatchResponse;
type Update = Self;
type Pattern = ServerStreaming;
}
impl RpcMsg<P2pService> for VersionRequest {
type Response = VersionResponse;
}
impl RpcMsg<P2pService> for ShutdownRequest {
type Response = RpcResult<()>;
}
impl RpcMsg<P2pService> for BitswapRequest {
type Response = RpcResult<BitswapResponse>;
}
impl Msg<P2pService> for FetchProvidersDhtRequest {
type Response = RpcResult<FetchProvidersDhtResponse>;
type Update = Self;
type Pattern = ServerStreaming;
}
impl RpcMsg<P2pService> for StopSessionBitswapRequest {
type Response = RpcResult<()>;
}
impl RpcMsg<P2pService> for NotifyNewBlocksBitswapRequest {
type Response = RpcResult<()>;
}
impl RpcMsg<P2pService> for GetListeningAddrsRequest {
type Response = RpcResult<GetListeningAddrsResponse>;
}
impl RpcMsg<P2pService> for GetPeersRequest {
type Response = RpcResult<GetPeersResponse>;
}
impl RpcMsg<P2pService> for ConnectRequest {
type Response = RpcResult<()>;
}
impl RpcMsg<P2pService> for ConnectByPeerIdRequest {
type Response = RpcResult<()>;
}
impl RpcMsg<P2pService> for DisconnectRequest {
type Response = RpcResult<()>;
}
impl RpcMsg<P2pService> for LookupRequest {
type Response = RpcResult<LookupResponse>;
}
impl RpcMsg<P2pService> for LookupLocalRequest {
type Response = RpcResult<LookupResponse>;
}
impl RpcMsg<P2pService> for GossipsubAddExplicitPeerRequest {
type Response = RpcResult<()>;
}
impl RpcMsg<P2pService> for GossipsubAllMeshPeersRequest {
type Response = RpcResult<GossipsubPeersResponse>;
}
impl RpcMsg<P2pService> for GossipsubMeshPeersRequest {
type Response = RpcResult<GossipsubPeersResponse>;
}
impl RpcMsg<P2pService> for GossipsubAllPeersRequest {
type Response = RpcResult<GossipsubAllPeersResponse>;
}
impl RpcMsg<P2pService> for GossipsubPublishRequest {
type Response = RpcResult<GossipsubPublishResponse>;
}
impl RpcMsg<P2pService> for GossipsubTopicsRequest {
type Response = RpcResult<GossipsubTopicsResponse>;
}
impl RpcMsg<P2pService> for GossipsubSubscribeRequest {
type Response = RpcResult<GossipsubSubscribeResponse>;
}
impl RpcMsg<P2pService> for GossipsubUnsubscribeRequest {
type Response = RpcResult<GossipsubUnsubscribeResponse>;
}
impl RpcMsg<P2pService> for GossipsubRemoveExplicitPeerRequest {
type Response = RpcResult<()>;
}
impl RpcMsg<P2pService> for StartProvidingRequest {
type Response = RpcResult<()>;
}
impl RpcMsg<P2pService> for StopProvidingRequest {
type Response = RpcResult<()>;
}
impl RpcMsg<P2pService> for LocalPeerIdRequest {
type Response = RpcResult<LocalPeerIdResponse>;
}
impl RpcMsg<P2pService> for ExternalAddrsRequest {
type Response = RpcResult<ExternalAddrsResponse>;
}
impl RpcMsg<P2pService> for ListenersRequest {
type Response = RpcResult<ListenersResponse>;
}