@cryptotaxi247 / kubo / commits / cae0ff237

Implement Swarm Api

This commit was moved from ipfs/go-ipfs-http-client@01105690d2da6e3f3581fa364c6284248a251a35

Łukasz Magiera committed Jan 15, 2019 at 17:36 UTC cae0ff2379f29a205426f7a8199c398885f33897
2 files changed +177 -1
client/httpapi/api.go
+1 -1
@@ -162,7 +162,7 @@ func (api *HttpApi) Dht() iface.DhtAPI {
162 }
163
164 func (api *HttpApi) Swarm() iface.SwarmAPI {
165 - return nil
165 + return (*SwarmAPI)(api)
166 }
167
168 func (api *HttpApi) PubSub() iface.PubSubAPI {
client/httpapi/swarm.go new
+176
@@ -0,0 +1,176 @@
1 +package httpapi
2 +
3 +import (
4 + "context"
5 + "github.com/libp2p/go-libp2p-protocol"
6 + "time"
7 +
8 + "github.com/ipfs/go-ipfs/core/coreapi/interface"
9 +
10 + inet "github.com/libp2p/go-libp2p-net"
11 + "github.com/libp2p/go-libp2p-peer"
12 + "github.com/libp2p/go-libp2p-peerstore"
13 + "github.com/multiformats/go-multiaddr"
14 +)
15 +
16 +type SwarmAPI HttpApi
17 +
18 +func (api *SwarmAPI) Connect(ctx context.Context, pi peerstore.PeerInfo) error {
19 + saddrs := make([]string, len(pi.Addrs))
20 + for i, addr := range pi.Addrs {
21 + saddrs[i] = addr.String()
22 + }
23 +
24 + return api.core().request("swarm/connect", saddrs...).Exec(ctx, nil)
25 +}
26 +
27 +func (api *SwarmAPI) Disconnect(ctx context.Context, addr multiaddr.Multiaddr) error {
28 + return api.core().request("swarm/disconnect", addr.String()).Exec(ctx, nil)
29 +}
30 +
31 +type streamInfo struct {
32 + Protocol string
33 +}
34 +
35 +type connInfo struct {
36 + Addr string
37 + Peer string
38 + JLatency time.Duration `json:"Latency"`
39 + Muxer string
40 + JDirection inet.Direction `json:"Direction"`
41 + JStreams []streamInfo `json:"Streams"`
42 +}
43 +
44 +func (c *connInfo) valid() error {
45 + _, err := multiaddr.NewMultiaddr(c.Addr)
46 + if err != nil {
47 + return err
48 + }
49 +
50 + _, err = peer.IDB58Decode(c.Peer)
51 + return err
52 +}
53 +
54 +func (c *connInfo) ID() peer.ID {
55 + id, _ := peer.IDB58Decode(c.Peer)
56 + return id
57 +}
58 +
59 +func (c *connInfo) Address() multiaddr.Multiaddr {
60 + a, _ := multiaddr.NewMultiaddr(c.Addr)
61 + return a
62 +}
63 +
64 +func (c *connInfo) Direction() inet.Direction {
65 + return c.JDirection
66 +}
67 +
68 +func (c *connInfo) Latency() (time.Duration, error) {
69 + return c.JLatency, nil
70 +}
71 +
72 +func (c *connInfo) Streams() ([]protocol.ID, error) {
73 + res := make([]protocol.ID, len(c.JStreams))
74 + for i, stream := range c.JStreams {
75 + res[i] = protocol.ID(stream.Protocol)
76 + }
77 + return res, nil
78 +}
79 +
80 +func (api *SwarmAPI) Peers(ctx context.Context) ([]iface.ConnectionInfo, error) {
81 + var out struct {
82 + Peers []*connInfo
83 + }
84 +
85 + err := api.core().request("swarm/peers").
86 + Option("streams", true).
87 + Option("latency", true).
88 + Exec(ctx, &out)
89 + if err != nil {
90 + return nil, err
91 + }
92 +
93 + res := make([]iface.ConnectionInfo, len(out.Peers))
94 + for i, conn := range out.Peers {
95 + if err := conn.valid(); err != nil {
96 + return nil, err
97 + }
98 + res[i] = conn
99 + }
100 +
101 + return res, nil
102 +}
103 +
104 +func (api *SwarmAPI) KnownAddrs(ctx context.Context) (map[peer.ID][]multiaddr.Multiaddr, error) {
105 + var out struct {
106 + Addrs map[string][]string
107 + }
108 + if err := api.core().request("swarm/addrs").Exec(ctx, &out); err != nil {
109 + return nil, err
110 + }
111 + res := map[peer.ID][]multiaddr.Multiaddr{}
112 + for spid, saddrs := range out.Addrs {
113 + addrs := make([]multiaddr.Multiaddr, len(saddrs))
114 +
115 + for i, addr := range saddrs {
116 + a, err := multiaddr.NewMultiaddr(addr)
117 + if err != nil {
118 + return nil, err
119 + }
120 + addrs[i] = a
121 + }
122 +
123 + pid, err := peer.IDB58Decode(spid)
124 + if err != nil {
125 + return nil, err
126 + }
127 +
128 + res[pid] = addrs
129 + }
130 +
131 + return res, nil
132 +}
133 +
134 +func (api *SwarmAPI) LocalAddrs(ctx context.Context) ([]multiaddr.Multiaddr, error) {
135 + var out struct {
136 + Strings []string
137 + }
138 +
139 + if err := api.core().request("swarm/addrs/local").Exec(ctx, &out); err != nil {
140 + return nil, err
141 + }
142 +
143 + res := make([]multiaddr.Multiaddr, len(out.Strings))
144 + for i, addr := range out.Strings {
145 + ma, err := multiaddr.NewMultiaddr(addr)
146 + if err != nil {
147 + return nil, err
148 + }
149 + res[i] = ma
150 + }
151 + return res, nil
152 +}
153 +
154 +func (api *SwarmAPI) ListenAddrs(ctx context.Context) ([]multiaddr.Multiaddr, error) {
155 + var out struct {
156 + Strings []string
157 + }
158 +
159 + if err := api.core().request("swarm/addrs/listen").Exec(ctx, &out); err != nil {
160 + return nil, err
161 + }
162 +
163 + res := make([]multiaddr.Multiaddr, len(out.Strings))
164 + for i, addr := range out.Strings {
165 + ma, err := multiaddr.NewMultiaddr(addr)
166 + if err != nil {
167 + return nil, err
168 + }
169 + res[i] = ma
170 + }
171 + return res, nil
172 +}
173 +
174 +func (api *SwarmAPI) core() *HttpApi {
175 + return (*HttpApi)(api)
176 +}