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
+}