github.com/ari-anchor/sei-tendermint@v0.0.0-20230519144642-dc826b7b56bb/scripts/estream/estream.go (about)

     1  // Program estream is a manual testing tool for polling the event stream
     2  // of a running Tendermint consensus node.
     3  package main
     4  
     5  import (
     6  	"context"
     7  	"encoding/json"
     8  	"flag"
     9  	"fmt"
    10  	"log"
    11  	"os"
    12  	"os/signal"
    13  	"path/filepath"
    14  
    15  	"github.com/ari-anchor/sei-tendermint/rpc/client/eventstream"
    16  	rpcclient "github.com/ari-anchor/sei-tendermint/rpc/client/http"
    17  	"github.com/ari-anchor/sei-tendermint/rpc/coretypes"
    18  )
    19  
    20  var (
    21  	query      = flag.String("query", "", "Filter query")
    22  	batchSize  = flag.Int("batch", 0, "Batch size")
    23  	resumeFrom = flag.String("resume", "", "Resume cursor")
    24  	numItems   = flag.Int("count", 0, "Number of items to read (0 to stream)")
    25  	waitTime   = flag.Duration("poll", 0, "Long poll interval")
    26  	rpcAddr    = flag.String("addr", "http://localhost:26657", "RPC service address")
    27  )
    28  
    29  func init() {
    30  	flag.Usage = func() {
    31  		fmt.Fprintf(os.Stderr, `Usage: %[1]s [options]
    32  
    33  Connect to the Tendermint node whose RPC service is at -addr, and poll for events
    34  matching the specified -query. If no query is given, all events are fetched.
    35  The resulting event data are written to stdout as JSON.
    36  
    37  Use -resume to pick up polling from a previously-reported event cursor.
    38  Use -count to stop polling after a certain number of events has been reported.
    39  Use -batch to override the default request batch size.
    40  Use -poll to override the default long-polling interval.
    41  
    42  Options:
    43  `, filepath.Base(os.Args[0]))
    44  		flag.PrintDefaults()
    45  	}
    46  }
    47  
    48  func main() {
    49  	flag.Parse()
    50  
    51  	cli, err := rpcclient.New(*rpcAddr)
    52  	if err != nil {
    53  		log.Fatalf("RPC client: %v", err)
    54  	}
    55  	stream := eventstream.New(cli, *query, &eventstream.StreamOptions{
    56  		BatchSize:  *batchSize,
    57  		ResumeFrom: *resumeFrom,
    58  		WaitTime:   *waitTime,
    59  	})
    60  
    61  	// Shut down cleanly on SIGINT.  Don't attempt clean shutdown for other
    62  	// fatal signals.
    63  	ctx, cancel := signal.NotifyContext(context.Background(), os.Interrupt)
    64  	defer cancel()
    65  
    66  	var nr int
    67  	if err := stream.Run(ctx, func(itm *coretypes.EventItem) error {
    68  		nr++
    69  		bits, err := json.Marshal(itm)
    70  		if err != nil {
    71  			return err
    72  		}
    73  		fmt.Println(string(bits))
    74  		if *numItems > 0 && nr >= *numItems {
    75  			return eventstream.ErrStopRunning
    76  		}
    77  		return nil
    78  	}); err != nil {
    79  		log.Fatalf("Stream failed: %v", err)
    80  	}
    81  }