package bootstrap import ( "context" "go.uber.org/fx" "go.uber.org/zap" edgenode "iop/apps/edge/internal/node" "iop/apps/edge/internal/transport" "iop/packages/config" "iop/packages/observability" ) func Module(cfg *config.EdgeConfig) fx.Option { return fx.Options( fx.Provide( func() *config.EdgeConfig { return cfg }, func(cfg *config.EdgeConfig) (*zap.Logger, error) { return observability.NewLogger(cfg.Logging.Level) }, func() *edgenode.Registry { return edgenode.NewRegistry() }, func(cfg *config.EdgeConfig, reg *edgenode.Registry, logger *zap.Logger) (*transport.Server, error) { return transport.NewServer(cfg.Server.Listen, reg, logger) }, ), fx.Invoke(func(lc fx.Lifecycle, srv *transport.Server, cfg *config.EdgeConfig, logger *zap.Logger) { lc.Append(fx.Hook{ OnStart: func(ctx context.Context) error { if err := srv.Start(ctx); err != nil { return err } go func() { if err := observability.ServeMetrics(cfg.Metrics.Port); err != nil { logger.Warn("metrics server exited", zap.Error(err)) } }() return nil }, OnStop: func(_ context.Context) error { return srv.Stop() }, }) }), ) }