github.com/celestiaorg/celestia-node@v0.15.0-beta.1/nodebuilder/header/module.go (about)

     1  package header
     2  
     3  import (
     4  	"context"
     5  
     6  	"github.com/ipfs/go-datastore"
     7  	logging "github.com/ipfs/go-log/v2"
     8  	pubsub "github.com/libp2p/go-libp2p-pubsub"
     9  	"github.com/libp2p/go-libp2p/core/host"
    10  	"go.uber.org/fx"
    11  
    12  	libhead "github.com/celestiaorg/go-header"
    13  	"github.com/celestiaorg/go-header/p2p"
    14  	"github.com/celestiaorg/go-header/sync"
    15  
    16  	"github.com/celestiaorg/celestia-node/header"
    17  	"github.com/celestiaorg/celestia-node/libs/pidstore"
    18  	modfraud "github.com/celestiaorg/celestia-node/nodebuilder/fraud"
    19  	"github.com/celestiaorg/celestia-node/nodebuilder/node"
    20  	modp2p "github.com/celestiaorg/celestia-node/nodebuilder/p2p"
    21  )
    22  
    23  var log = logging.Logger("module/header")
    24  
    25  func ConstructModule[H libhead.Header[H]](tp node.Type, cfg *Config) fx.Option {
    26  	// sanitize config values before constructing module
    27  	cfgErr := cfg.Validate(tp)
    28  
    29  	baseComponents := fx.Options(
    30  		fx.Supply(*cfg),
    31  		fx.Error(cfgErr),
    32  		fx.Provide(newHeaderService),
    33  		fx.Provide(newInitStore[H]),
    34  		fx.Provide(func(subscriber *p2p.Subscriber[H]) libhead.Subscriber[H] {
    35  			return subscriber
    36  		}),
    37  		fx.Provide(fx.Annotate(
    38  			newSyncer[H],
    39  			fx.OnStart(func(
    40  				ctx context.Context,
    41  				breaker *modfraud.ServiceBreaker[*sync.Syncer[H], H],
    42  			) error {
    43  				return breaker.Start(ctx)
    44  			}),
    45  			fx.OnStop(func(
    46  				ctx context.Context,
    47  				breaker *modfraud.ServiceBreaker[*sync.Syncer[H], H],
    48  			) error {
    49  				return breaker.Stop(ctx)
    50  			}),
    51  		)),
    52  		fx.Provide(fx.Annotate(
    53  			func(ps *pubsub.PubSub, network modp2p.Network) (*p2p.Subscriber[H], error) {
    54  				opts := []p2p.SubscriberOption{p2p.WithSubscriberNetworkID(network.String())}
    55  				if MetricsEnabled {
    56  					opts = append(opts, p2p.WithSubscriberMetrics())
    57  				}
    58  				return p2p.NewSubscriber[H](ps, header.MsgID, opts...)
    59  			},
    60  			fx.OnStart(func(ctx context.Context, sub *p2p.Subscriber[H]) error {
    61  				return sub.Start(ctx)
    62  			}),
    63  			fx.OnStop(func(ctx context.Context, sub *p2p.Subscriber[H]) error {
    64  				return sub.Stop(ctx)
    65  			}),
    66  		)),
    67  		fx.Provide(fx.Annotate(
    68  			func(
    69  				cfg Config,
    70  				host host.Host,
    71  				store libhead.Store[H],
    72  				network modp2p.Network,
    73  			) (*p2p.ExchangeServer[H], error) {
    74  				opts := []p2p.Option[p2p.ServerParameters]{
    75  					p2p.WithParams(cfg.Server),
    76  					p2p.WithNetworkID[p2p.ServerParameters](network.String()),
    77  				}
    78  				if MetricsEnabled {
    79  					opts = append(opts, p2p.WithMetrics[p2p.ServerParameters]())
    80  				}
    81  
    82  				return p2p.NewExchangeServer[H](host, store, opts...)
    83  			},
    84  			fx.OnStart(func(ctx context.Context, server *p2p.ExchangeServer[H]) error {
    85  				return server.Start(ctx)
    86  			}),
    87  			fx.OnStop(func(ctx context.Context, server *p2p.ExchangeServer[H]) error {
    88  				return server.Stop(ctx)
    89  			}),
    90  		)),
    91  	)
    92  
    93  	switch tp {
    94  	case node.Light, node.Full:
    95  		return fx.Module(
    96  			"header",
    97  			baseComponents,
    98  			fx.Provide(newP2PExchange[H]),
    99  			fx.Provide(func(ctx context.Context, ds datastore.Batching) (p2p.PeerIDStore, error) {
   100  				return pidstore.NewPeerIDStore(ctx, ds)
   101  			}),
   102  		)
   103  	case node.Bridge:
   104  		return fx.Module(
   105  			"header",
   106  			baseComponents,
   107  			fx.Provide(func(subscriber *p2p.Subscriber[H]) libhead.Broadcaster[H] {
   108  				return subscriber
   109  			}),
   110  			fx.Supply(header.MakeExtendedHeader),
   111  		)
   112  	default:
   113  		panic("invalid node type")
   114  	}
   115  }