co_primitives/types/network.rs
1// SPDX-License-Identifier: AGPL-3.0-only
2// Copyright (C) 2026 1io BRANDGUARDIAN GmbH
3
4use crate::CoId;
5use co_macros::co;
6
7/// Network service connectivity description.
8#[co]
9#[non_exhaustive]
10pub enum Network {
11 /// DID Discovery protocol.
12 //#[serde(rename = "/meshsub/1.1.0/diddiscovery/1.0.0")]
13 DidDiscovery(NetworkDidDiscovery),
14
15 /// CO Heads protocol.
16 //#[serde(rename = "/meshsub/1.1.0/coheads/1.0.0")]
17 CoHeads(NetworkCoHeads),
18
19 /// Rendezvouz protocol.
20 //#[serde(rename = "/rendezvous/1.0.0")]
21 Rendezvous(NetworkRendezvous),
22
23 /// Direct peer connection.
24 //#[serde(rename = "/p2p")]
25 Peer(NetworkPeer),
26}
27
28/// DID Discovery protocol.
29#[co]
30pub struct NetworkDidDiscovery {
31 /// The GossipSub topic used for DidDiscovery messages.
32 /// If not specified the default topic will be used: `"co-contact"`.
33 pub topic: Option<String>,
34
35 /// The DID to be discovered.
36 pub did: String,
37}
38
39/// CO Heads protocol.
40#[co]
41pub struct NetworkCoHeads {
42 /// The GossipSub topic used for Heads messages.
43 /// If not specified the default topic will be used: `"co-{co.id}"`.
44 pub topic: Option<String>,
45
46 /// The CO to be discovered.
47 pub id: CoId,
48}
49
50/// Rendezvouz protocol.
51#[co]
52pub struct NetworkRendezvous {
53 /// The namespace to register to.
54 pub namespace: String,
55 /// Rendezvouz node multi-addresses.
56 pub addresses: Vec<String>,
57}
58
59/// Direct peer connection.
60#[co]
61pub struct NetworkPeer {
62 /// The [`libp2p::PeerId`] as bytes.
63 pub peer: Vec<u8>,
64 /// Optional known Multi-addresses.
65 /// If empty, mDNS, Kademila and Bluetooth LE may be used to resolve.
66 pub addresses: Vec<String>,
67}