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 }