@@ -2,11 +2,13 @@ package node
2
2
3
3
import (
4
4
"context"
5
+ "github.com/ipfs/go-metrics-interface"
5
6
"time"
6
7
7
8
"github.com/ipfs/boxo/bitswap"
8
9
"github.com/ipfs/boxo/bitswap/client"
9
10
"github.com/ipfs/boxo/bitswap/network"
11
+ "github.com/ipfs/boxo/bitswap/server"
10
12
blockstore "github.com/ipfs/boxo/blockstore"
11
13
exchange "github.com/ipfs/boxo/exchange"
12
14
"github.com/ipfs/boxo/exchange/providing"
@@ -32,7 +34,8 @@ const (
32
34
type bitswapOptionsOut struct {
33
35
fx.Out
34
36
35
- BitswapOpts []bitswap.Option `group:"bitswap-options,flatten"`
37
+ BitswapClientOpts []client.Option `group:"bitswap-client-options,flatten"`
38
+ BitswapServerOpts []server.Option `group:"bitswap-server-options,flatten"`
36
39
}
37
40
38
41
// BitswapOptions creates configuration options for Bitswap from the config file
@@ -44,27 +47,31 @@ func BitswapOptions(cfg *config.Config) interface{} {
44
47
internalBsCfg = * cfg .Internal .Bitswap
45
48
}
46
49
47
- opts := []bitswap.Option {
48
- bitswap .ProviderSearchDelay (internalBsCfg .ProviderSearchDelay .WithDefault (DefaultProviderSearchDelay )), // See https://github.com/ipfs/go-ipfs/issues/8807 for rationale
49
- bitswap .EngineBlockstoreWorkerCount (int (internalBsCfg .EngineBlockstoreWorkerCount .WithDefault (DefaultEngineBlockstoreWorkerCount ))),
50
- bitswap .TaskWorkerCount (int (internalBsCfg .TaskWorkerCount .WithDefault (DefaultTaskWorkerCount ))),
51
- bitswap .EngineTaskWorkerCount (int (internalBsCfg .EngineTaskWorkerCount .WithDefault (DefaultEngineTaskWorkerCount ))),
52
- bitswap .MaxOutstandingBytesPerPeer (int (internalBsCfg .MaxOutstandingBytesPerPeer .WithDefault (DefaultMaxOutstandingBytesPerPeer ))),
53
- bitswap .WithWantHaveReplaceSize (int (internalBsCfg .WantHaveReplaceSize .WithDefault (DefaultWantHaveReplaceSize ))),
50
+ clientOpts := []client.Option {
51
+ client .ProviderSearchDelay (internalBsCfg .ProviderSearchDelay .WithDefault (DefaultProviderSearchDelay )), // See https://github.com/ipfs/go-ipfs/issues/8807 for rationale
54
52
}
55
53
56
- return bitswapOptionsOut {BitswapOpts : opts }
54
+ serverOpts := []server.Option {
55
+ server .EngineBlockstoreWorkerCount (int (internalBsCfg .EngineBlockstoreWorkerCount .WithDefault (DefaultEngineBlockstoreWorkerCount ))),
56
+ server .TaskWorkerCount (int (internalBsCfg .TaskWorkerCount .WithDefault (DefaultTaskWorkerCount ))),
57
+ server .EngineTaskWorkerCount (int (internalBsCfg .EngineTaskWorkerCount .WithDefault (DefaultEngineTaskWorkerCount ))),
58
+ server .MaxOutstandingBytesPerPeer (int (internalBsCfg .MaxOutstandingBytesPerPeer .WithDefault (DefaultMaxOutstandingBytesPerPeer ))),
59
+ server .WithWantHaveReplaceSize (int (internalBsCfg .WantHaveReplaceSize .WithDefault (DefaultWantHaveReplaceSize ))),
60
+ }
61
+
62
+ return bitswapOptionsOut {BitswapClientOpts : clientOpts , BitswapServerOpts : serverOpts }
57
63
}
58
64
}
59
65
60
66
type bitswapIn struct {
61
67
fx.In
62
68
63
- Mctx helpers.MetricsCtx
64
- Host host.Host
65
- Rt irouting.ProvideManyRouter
66
- Bs blockstore.GCBlockstore
67
- BitswapOpts []bitswap.Option `group:"bitswap-options"`
69
+ Mctx helpers.MetricsCtx
70
+ Host host.Host
71
+ Rt irouting.ProvideManyRouter
72
+ Bs blockstore.GCBlockstore
73
+ BitswapClientOpts []client.Option `group:"bitswap-client-options"`
74
+ BitswapServerOpts []server.Option `group:"bitswap-server-options"`
68
75
}
69
76
70
77
// Bitswap creates the BitSwap server/client instance.
@@ -78,7 +85,15 @@ func Bitswap(provide bool) interface{} {
78
85
if provide {
79
86
provider = in .Rt
80
87
}
81
- bs := bitswap .New (helpers .LifecycleCtx (in .Mctx , lc ), bitswapNetwork , provider , in .Bs , in .BitswapOpts ... )
88
+
89
+ var bsOpts []bitswap.Option
90
+ for _ , opt := range in .BitswapClientOpts {
91
+ bsOpts = append (bsOpts , bitswap .WithClientOption (opt ))
92
+ }
93
+ for _ , opt := range in .BitswapServerOpts {
94
+ bsOpts = append (bsOpts , bitswap .WithServerOption (opt ))
95
+ }
96
+ bs := bitswap .New (helpers .LifecycleCtx (in .Mctx , lc ), bitswapNetwork , provider , in .Bs , bsOpts ... )
82
97
83
98
lc .Append (fx.Hook {
84
99
OnStop : func (ctx context.Context ) error {
@@ -101,6 +116,46 @@ func OnlineExchange() interface{} {
101
116
}
102
117
}
103
118
119
+ // Bitswap creates the BitSwap server/client instance.
120
+ // Additional options to bitswap.New can be provided via the "bitswap-options"
121
+ // group.
122
+ func BitswapClientOnly (provide bool ) interface {} {
123
+ return func (in bitswapIn , lc fx.Lifecycle ) * client.Client {
124
+ bitswapNetwork := network .NewFromIpfsHost (in .Host )
125
+
126
+ var provider client.ProviderFinder
127
+ if provide {
128
+ provider = in .Rt
129
+ }
130
+
131
+ ctx := helpers .LifecycleCtx (in .Mctx , lc )
132
+ ctx = metrics .CtxSubScope (ctx , "bitswap" )
133
+ bs := client .New (ctx , bitswapNetwork , provider , in .Bs , in .BitswapClientOpts ... )
134
+ bitswapNetwork .Start (bs ) // use the polyfill receiver to log received errors and trace messages only once
135
+
136
+ lc .Append (fx.Hook {
137
+ OnStop : func (ctx context.Context ) error {
138
+ bitswapNetwork .Stop ()
139
+ return bs .Close ()
140
+ },
141
+ })
142
+
143
+ return bs
144
+ }
145
+ }
146
+
147
+ // OnlineExchange creates new LibP2P backed block exchange.
148
+ func OnlineExchangeClientOnly () interface {} {
149
+ return func (in * client.Client , lc fx.Lifecycle ) exchange.Interface {
150
+ lc .Append (fx.Hook {
151
+ OnStop : func (ctx context.Context ) error {
152
+ return in .Close ()
153
+ },
154
+ })
155
+ return in
156
+ }
157
+ }
158
+
104
159
type providingExchangeIn struct {
105
160
fx.In
106
161
0 commit comments