- package lite
-
- import (
- "time"
-
- "github.com/tendermint/tendermint/types"
- )
-
- // AutoClient can auto update itself by fetching headers every N seconds.
- type AutoClient struct {
- base *Client
- updatePeriod time.Duration
- quit chan struct{}
-
- trustedHeaders chan *types.SignedHeader
- err chan error
- }
-
- // NewAutoClient creates a new client and starts a polling goroutine.
- func NewAutoClient(base *Client, updatePeriod time.Duration) *AutoClient {
- c := &AutoClient{
- base: base,
- updatePeriod: updatePeriod,
- quit: make(chan struct{}),
- trustedHeaders: make(chan *types.SignedHeader),
- err: make(chan error),
- }
- go c.autoUpdate()
- return c
- }
-
- // TrustedHeaders returns a channel onto which new trusted headers are posted.
- func (c *AutoClient) TrustedHeaders() <-chan *types.SignedHeader {
- return c.trustedHeaders
- }
-
- // Err returns a channel onto which errors are posted.
- func (c *AutoClient) Err() <-chan error {
- return c.err
- }
-
- // Stop stops the client.
- func (c *AutoClient) Stop() {
- close(c.quit)
- }
-
- func (c *AutoClient) autoUpdate() {
- lastTrustedHeight, err := c.base.LastTrustedHeight()
- if err != nil {
- c.err <- err
- return
- }
-
- ticker := time.NewTicker(c.updatePeriod)
- defer ticker.Stop()
-
- for {
- select {
- case <-ticker.C:
- err := c.base.VerifyHeaderAtHeight(lastTrustedHeight+1, time.Now())
- if err != nil {
- c.err <- err
- continue
- }
- h, err := c.base.TrustedHeader(lastTrustedHeight+1, time.Now())
- if err != nil {
- c.err <- err
- continue
- }
- c.trustedHeaders <- h
- lastTrustedHeight = h.Height
- case <-c.quit:
- return
- }
- }
- }
|