77 "github.com/ipfs/boxo/blockservice"
88 blockstore "github.com/ipfs/boxo/blockstore"
99 exchange "github.com/ipfs/boxo/exchange"
10- offline "github.com/ipfs/boxo/exchange/offline"
1110 "github.com/ipfs/boxo/fetcher"
1211 bsfetcher "github.com/ipfs/boxo/fetcher/impl/blockservice"
1312 "github.com/ipfs/boxo/filestore"
@@ -17,6 +16,7 @@ import (
1716 pathresolver "github.com/ipfs/boxo/path/resolver"
1817 pin "github.com/ipfs/boxo/pinning/pinner"
1918 "github.com/ipfs/boxo/pinning/pinner/dspinner"
19+ "github.com/ipfs/boxo/provider"
2020 "github.com/ipfs/go-cid"
2121 "github.com/ipfs/go-datastore"
2222 format "github.com/ipfs/go-ipld-format"
@@ -29,8 +29,8 @@ import (
2929)
3030
3131// BlockService creates new blockservice which provides an interface to fetch content-addressable blocks
32- func BlockService (lc fx.Lifecycle , bs blockstore.Blockstore , rem exchange.Interface ) blockservice.BlockService {
33- bsvc := blockservice .New (bs , rem )
32+ func BlockService (lc fx.Lifecycle , bs blockstore.Blockstore , rem exchange.Interface , prov provider. System ) blockservice.BlockService {
33+ bsvc := blockservice .New (bs , rem , blockservice . WithProvider ( prov ) )
3434
3535 lc .Append (fx.Hook {
3636 OnStop : func (ctx context.Context ) error {
@@ -41,6 +41,32 @@ func BlockService(lc fx.Lifecycle, bs blockstore.Blockstore, rem exchange.Interf
4141 return bsvc
4242}
4343
44+ type offlineIn struct {
45+ fx.In
46+
47+ Bs blockstore.Blockstore
48+ Prov provider.System `optional:"true"`
49+ }
50+
51+ type offlineOut struct {
52+ fx.Out
53+
54+ Bs blockservice.BlockService `name:"offlineBlockService"`
55+ }
56+
57+ // OfflineBlockservice is like [BlockService] but it makes an offline version.
58+ func OfflineBlockservice (lc fx.Lifecycle , in offlineIn ) offlineOut {
59+ bsvc := blockservice .New (in .Bs , nil , blockservice .WithProvider (in .Prov ))
60+
61+ lc .Append (fx.Hook {
62+ OnStop : func (ctx context.Context ) error {
63+ return bsvc .Close ()
64+ },
65+ })
66+
67+ return offlineOut {Bs : bsvc }
68+ }
69+
4470// Pinning creates new pinner which tells GC which blocks should be kept
4571func Pinning (bstore blockstore.Blockstore , ds format.DAGService , repo repo.Repo ) (pin.Pinner , error ) {
4672 rootDS := repo .Datastore ()
@@ -82,38 +108,34 @@ func (s *syncDagService) Session(ctx context.Context) format.NodeGetter {
82108 return merkledag .NewSession (ctx , s .DAGService )
83109}
84110
85- // FetchersOut allows injection of fetchers.
86- type FetchersOut struct {
111+ // fetchersOut allows injection of fetchers.
112+ type fetchersOut struct {
87113 fx.Out
88114 IPLDFetcher fetcher.Factory `name:"ipldFetcher"`
89115 UnixfsFetcher fetcher.Factory `name:"unixfsFetcher"`
90116 OfflineIPLDFetcher fetcher.Factory `name:"offlineIpldFetcher"`
91117 OfflineUnixfsFetcher fetcher.Factory `name:"offlineUnixfsFetcher"`
92118}
93119
94- // FetchersIn allows using fetchers for other dependencies.
95- type FetchersIn struct {
120+ type fetcherIn struct {
96121 fx.In
97- IPLDFetcher fetcher.Factory `name:"ipldFetcher"`
98- UnixfsFetcher fetcher.Factory `name:"unixfsFetcher"`
99- OfflineIPLDFetcher fetcher.Factory `name:"offlineIpldFetcher"`
100- OfflineUnixfsFetcher fetcher.Factory `name:"offlineUnixfsFetcher"`
122+ Online blockservice.BlockService
123+ Offline blockservice.BlockService `name:"offlineBlockService"`
101124}
102125
103126// FetcherConfig returns a fetcher config that can build new fetcher instances
104- func FetcherConfig (bs blockservice. BlockService ) FetchersOut {
105- ipldFetcher := bsfetcher .NewFetcherConfig (bs )
127+ func FetcherConfig (in fetcherIn ) fetchersOut {
128+ ipldFetcher := bsfetcher .NewFetcherConfig (in . Online )
106129 ipldFetcher .PrototypeChooser = dagpb .AddSupportToChooser (bsfetcher .DefaultPrototypeChooser )
107130 unixFSFetcher := ipldFetcher .WithReifier (unixfsnode .Reify )
108131
109132 // Construct offline versions which we can safely use in contexts where
110133 // path resolution should not fetch new blocks via exchange.
111- offlineBs := blockservice .New (bs .Blockstore (), offline .Exchange (bs .Blockstore ()))
112- offlineIpldFetcher := bsfetcher .NewFetcherConfig (offlineBs )
134+ offlineIpldFetcher := bsfetcher .NewFetcherConfig (in .Offline )
113135 offlineIpldFetcher .PrototypeChooser = dagpb .AddSupportToChooser (bsfetcher .DefaultPrototypeChooser )
114136 offlineUnixFSFetcher := offlineIpldFetcher .WithReifier (unixfsnode .Reify )
115137
116- return FetchersOut {
138+ return fetchersOut {
117139 IPLDFetcher : ipldFetcher ,
118140 UnixfsFetcher : unixFSFetcher ,
119141 OfflineIPLDFetcher : offlineIpldFetcher ,
@@ -130,8 +152,17 @@ type PathResolversOut struct {
130152 OfflineUnixFSPathResolver pathresolver.Resolver `name:"offlineUnixFSPathResolver"`
131153}
132154
155+ // PathResolverIn allows using fetchers for other dependencies.
156+ type PathResolverIn struct {
157+ fx.In
158+ IPLDFetcher fetcher.Factory `name:"ipldFetcher"`
159+ UnixfsFetcher fetcher.Factory `name:"unixfsFetcher"`
160+ OfflineIPLDFetcher fetcher.Factory `name:"offlineIpldFetcher"`
161+ OfflineUnixfsFetcher fetcher.Factory `name:"offlineUnixfsFetcher"`
162+ }
163+
133164// PathResolverConfig creates path resolvers with the given fetchers.
134- func PathResolverConfig (fetchers FetchersIn ) PathResolversOut {
165+ func PathResolverConfig (fetchers PathResolverIn ) PathResolversOut {
135166 return PathResolversOut {
136167 IPLDPathResolver : pathresolver .NewBasicResolver (fetchers .IPLDFetcher ),
137168 UnixFSPathResolver : pathresolver .NewBasicResolver (fetchers .UnixfsFetcher ),
@@ -145,6 +176,23 @@ func Dag(bs blockservice.BlockService) format.DAGService {
145176 return merkledag .NewDAGService (bs )
146177}
147178
179+ type offlineDagIn struct {
180+ fx.In
181+
182+ Bs blockservice.BlockService `name:"offlineBlockService"`
183+ }
184+
185+ type offlineDagOut struct {
186+ fx.Out
187+
188+ DAG format.DAGService `name:"offlineDagService"`
189+ }
190+
191+ // OfflineDag is like [Dag] but it makes an offline version.
192+ func OfflineDag (lc fx.Lifecycle , in offlineDagIn ) offlineDagOut {
193+ return offlineDagOut {DAG : merkledag .NewDAGService (in .Bs )}
194+ }
195+
148196// Files loads persisted MFS root
149197func Files (mctx helpers.MetricsCtx , lc fx.Lifecycle , repo repo.Repo , dag format.DAGService ) (* mfs.Root , error ) {
150198 dsk := datastore .NewKey ("/local/filesroot" )
0 commit comments