package proxy import ( "fmt" "github.com/tendermint/tendermint/libs/service" ) //----------------------------- // Tendermint's interface to the application consists of multiple connections type AppConns interface { service.Service Mempool() AppConnMempool Consensus() AppConnConsensus Query() AppConnQuery Snapshot() AppConnSnapshot } func NewAppConns(clientCreator ClientCreator) AppConns { return NewMultiAppConn(clientCreator) } //----------------------------- // multiAppConn implements AppConns // a multiAppConn is made of a few appConns (mempool, consensus, query) // and manages their underlying abci clients // TODO: on app restart, clients must reboot together type multiAppConn struct { service.BaseService mempoolConn AppConnMempool consensusConn AppConnConsensus queryConn AppConnQuery snapshotConn AppConnSnapshot clientCreator ClientCreator } // Make all necessary abci connections to the application func NewMultiAppConn(clientCreator ClientCreator) AppConns { multiAppConn := &multiAppConn{ clientCreator: clientCreator, } multiAppConn.BaseService = *service.NewBaseService(nil, "multiAppConn", multiAppConn) return multiAppConn } // Returns the mempool connection func (app *multiAppConn) Mempool() AppConnMempool { return app.mempoolConn } // Returns the consensus Connection func (app *multiAppConn) Consensus() AppConnConsensus { return app.consensusConn } // Returns the query Connection func (app *multiAppConn) Query() AppConnQuery { return app.queryConn } // Returns the snapshot Connection func (app *multiAppConn) Snapshot() AppConnSnapshot { return app.snapshotConn } func (app *multiAppConn) OnStart() error { // query connection querycli, err := app.clientCreator.NewABCIClient() if err != nil { return fmt.Errorf("error creating ABCI client (query connection): %w", err) } querycli.SetLogger(app.Logger.With("module", "abci-client", "connection", "query")) if err := querycli.Start(); err != nil { return fmt.Errorf("error starting ABCI client (query connection): %w", err) } app.queryConn = NewAppConnQuery(querycli) // snapshot connection snapshotcli, err := app.clientCreator.NewABCIClient() if err != nil { return fmt.Errorf("error creating ABCI client (snapshot connection): %w", err) } snapshotcli.SetLogger(app.Logger.With("module", "abci-client", "connection", "snapshot")) if err := snapshotcli.Start(); err != nil { return fmt.Errorf("error starting ABCI client (snapshot connection): %w", err) } app.snapshotConn = NewAppConnSnapshot(snapshotcli) // mempool connection memcli, err := app.clientCreator.NewABCIClient() if err != nil { return fmt.Errorf("error creating ABCI client (mempool connection): %w", err) } memcli.SetLogger(app.Logger.With("module", "abci-client", "connection", "mempool")) if err := memcli.Start(); err != nil { return fmt.Errorf("error starting ABCI client (mempool connection): %w", err) } app.mempoolConn = NewAppConnMempool(memcli) // consensus connection concli, err := app.clientCreator.NewABCIClient() if err != nil { return fmt.Errorf("error creating ABCI client (consensus connection): %w", err) } concli.SetLogger(app.Logger.With("module", "abci-client", "connection", "consensus")) if err := concli.Start(); err != nil { return fmt.Errorf("error starting ABCI client (consensus connection): %w", err) } app.consensusConn = NewAppConnConsensus(concli) return nil }