/
resolve.go
111 lines (93 loc) · 2.76 KB
/
resolve.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
package ipfs
import (
"context"
fserrors "github.com/djdv/go-filesystem-utils/internal/filesystem/errors"
"github.com/ipfs/boxo/blockservice"
"github.com/ipfs/boxo/exchange"
bsfetcher "github.com/ipfs/boxo/fetcher/impl/blockservice"
"github.com/ipfs/boxo/path/resolver"
blocks "github.com/ipfs/go-block-format"
"github.com/ipfs/go-cid"
ipld "github.com/ipfs/go-ipld-format"
"github.com/ipfs/go-unixfsnode"
dagpb "github.com/ipld/go-codec-dagpb"
)
type (
fnBlockStore getNodeFunc
fnBlockFetcher getNodeFunc
getNodeFunc func(cid cid.Cid) (ipld.Node, error)
)
func newPathResolver(getNodeFn getNodeFunc) resolver.Resolver {
var (
blockstore = newCoreBlockStore(getNodeFn)
fetcher = makeBlockFetcher(getNodeFn)
service = blockservice.New(blockstore, fetcher)
config = bsfetcher.NewFetcherConfig(service)
)
config.PrototypeChooser = dagpb.AddSupportToChooser(config.PrototypeChooser)
fetcherFactory := config.WithReifier(unixfsnode.Reify)
return resolver.NewBasicResolver(fetcherFactory)
}
func newCoreBlockStore(getNodeFn getNodeFunc) fnBlockStore {
return fnBlockStore(getNodeFn)
}
func makeBlockFetcher(getNodeFn getNodeFunc) exchange.Interface {
return fnBlockFetcher(getNodeFn)
}
func (getNodeFn fnBlockStore) Has(_ context.Context, c cid.Cid) (bool, error) {
blk, err := getNodeFn(c)
if err != nil {
return false, err
}
return blk != nil, nil
}
func (getNodeFn fnBlockStore) Get(_ context.Context, c cid.Cid) (blocks.Block, error) {
return getNodeFn(c)
}
func (getNodeFn fnBlockStore) GetSize(ctx context.Context, c cid.Cid) (int, error) {
blk, err := getNodeFn(c)
if err != nil {
return 0, err
}
return len(blk.RawData()), nil
}
func (fnBlockStore) HashOnRead(bool) {}
func (fnBlockStore) Put(context.Context, blocks.Block) error {
return fserrors.ErrUnsupported
}
func (fnBlockStore) PutMany(context.Context, []blocks.Block) error {
return fserrors.ErrUnsupported
}
func (fnBlockStore) AllKeysChan(ctx context.Context) (<-chan cid.Cid, error) {
return nil, fserrors.ErrUnsupported
}
func (fnBlockStore) DeleteBlock(context.Context, cid.Cid) error {
return fserrors.ErrUnsupported
}
func (getNodeFn fnBlockFetcher) GetBlock(_ context.Context, c cid.Cid) (blocks.Block, error) {
return getNodeFn(c)
}
func (blockGetter fnBlockFetcher) GetBlocks(ctx context.Context, cids []cid.Cid) (<-chan blocks.Block, error) {
out := make(chan blocks.Block)
go func() {
defer close(out)
for _, c := range cids {
block, err := blockGetter.GetBlock(ctx, c)
if err != nil {
return
}
select {
case out <- block:
case <-ctx.Done():
return
}
}
}()
return out, nil
}
func (fnBlockFetcher) NotifyNewBlocks(ctx context.Context, blocks ...blocks.Block) error {
return nil
}
func (fnBlockFetcher) Close() error {
return nil
}