-
-
Notifications
You must be signed in to change notification settings - Fork 3k
/
composer.go
130 lines (105 loc) · 3.65 KB
/
composer.go
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
package routing
import (
"context"
"github.com/hashicorp/go-multierror"
"github.com/ipfs/go-cid"
routinghelpers "github.com/libp2p/go-libp2p-routing-helpers"
"github.com/libp2p/go-libp2p/core/peer"
"github.com/libp2p/go-libp2p/core/routing"
"github.com/multiformats/go-multihash"
)
var _ routinghelpers.ProvideManyRouter = &Composer{}
var _ routing.Routing = &Composer{}
type Composer struct {
GetValueRouter routing.Routing
PutValueRouter routing.Routing
FindPeersRouter routing.Routing
FindProvidersRouter routing.Routing
ProvideRouter routing.Routing
}
func (c *Composer) Provide(ctx context.Context, cid cid.Cid, provide bool) error {
log.Debug("composer: calling provide: ", cid)
err := c.ProvideRouter.Provide(ctx, cid, provide)
if err != nil {
log.Debug("composer: calling provide: ", cid, " error: ", err)
}
return err
}
func (c *Composer) ProvideMany(ctx context.Context, keys []multihash.Multihash) error {
log.Debug("composer: calling provide many: ", len(keys))
pmr, ok := c.ProvideRouter.(routinghelpers.ProvideManyRouter)
if !ok {
log.Debug("composer: provide many is not implemented on the actual router")
return nil
}
err := pmr.ProvideMany(ctx, keys)
if err != nil {
log.Debug("composer: calling provide many error: ", err)
}
return err
}
func (c *Composer) Ready() bool {
log.Debug("composer: calling ready")
pmr, ok := c.ProvideRouter.(routinghelpers.ProvideManyRouter)
if !ok {
return true
}
ready := pmr.Ready()
log.Debug("composer: calling ready result: ", ready)
return ready
}
func (c *Composer) FindProvidersAsync(ctx context.Context, cid cid.Cid, count int) <-chan peer.AddrInfo {
log.Debug("composer: calling findProvidersAsync: ", cid)
return c.FindProvidersRouter.FindProvidersAsync(ctx, cid, count)
}
func (c *Composer) FindPeer(ctx context.Context, pid peer.ID) (peer.AddrInfo, error) {
log.Debug("composer: calling findPeer: ", pid)
addr, err := c.FindPeersRouter.FindPeer(ctx, pid)
if err != nil {
log.Debug("composer: calling findPeer error: ", pid, addr.String(), err)
}
return addr, err
}
func (c *Composer) PutValue(ctx context.Context, key string, val []byte, opts ...routing.Option) error {
log.Debug("composer: calling putValue: ", key, len(val))
err := c.PutValueRouter.PutValue(ctx, key, val, opts...)
if err != nil {
log.Debug("composer: calling putValue error: ", key, len(val), err)
}
return err
}
func (c *Composer) GetValue(ctx context.Context, key string, opts ...routing.Option) ([]byte, error) {
log.Debug("composer: calling getValue: ", key)
val, err := c.GetValueRouter.GetValue(ctx, key, opts...)
if err != nil {
log.Debug("composer: calling getValue error: ", key, len(val), err)
}
return val, err
}
func (c *Composer) SearchValue(ctx context.Context, key string, opts ...routing.Option) (<-chan []byte, error) {
log.Debug("composer: calling searchValue: ", key)
ch, err := c.GetValueRouter.SearchValue(ctx, key, opts...)
// avoid nil channels on implementations not supporting SearchValue method.
if err == routing.ErrNotFound && ch == nil {
out := make(chan []byte)
close(out)
return out, err
}
if err != nil {
log.Debug("composer: calling searchValue error: ", key, err)
}
return ch, err
}
func (c *Composer) Bootstrap(ctx context.Context) error {
log.Debug("composer: calling bootstrap")
errfp := c.FindPeersRouter.Bootstrap(ctx)
errfps := c.FindProvidersRouter.Bootstrap(ctx)
errgv := c.GetValueRouter.Bootstrap(ctx)
errpv := c.PutValueRouter.Bootstrap(ctx)
errp := c.ProvideRouter.Bootstrap(ctx)
err := multierror.Append(errfp, errfps, errgv, errpv, errp)
if err != nil {
log.Debug("composer: calling bootstrap error: ", err)
}
return err
}