The api is designed with go channels.
package main
import (
"context"
"fmt"
"os"
"os/signal"
"github.com/eosswedenorg/thalos/api"
"github.com/eosswedenorg/thalos/api/message"
_ "github.com/eosswedenorg/thalos/api/message/json"
api_redis "github.com/eosswedenorg/thalos/api/redis"
"github.com/redis/go-redis/v9"
)
func main() {
// Create redis client
rdb := redis.NewClient(&redis.Options{})
sub := api_redis.NewSubscriber(context.Background(), rdb, api_redis.Namespace{
Prefix: "ship",
ChainID: "1064487b3cd1a897ce03ae5b6a865651747e2e152090f99c1d19d44e01aea5a4", // Wax mainnet.
})
// Create thalos client
codec, err := message.GetCodec("json")
if err != nil {
fmt.Println("Failed to get json codec")
return
}
client := api.NewClient(sub, codec.Decoder)
// Subscribe to some channels.
err = client.Subscribe(
api.TransactionChannel,
api.ActionChannel{Contract: "eosio"}.Channel(),
api.ActionChannel{Name: "mine"}.Channel(),
api.HeartbeatChannel,
api.TableDeltaChannel{}.Channel(),
)
if err != nil {
fmt.Println(err)
return
}
// Wait for interrupt in a go routine and close the client.
go func() {
sig := make(chan os.Signal)
signal.Notify(sig, os.Interrupt)
<-sig
fmt.Println("Got interrupt")
client.Close()
}()
// Read messages
for t := range client.Channel() {
switch msg := t.(type) {
case error:
fmt.Println("Error:", msg)
case message.TransactionTrace:
fmt.Println("Transaction", msg.BlockNum, msg.ID)
fmt.Println(msg)
fmt.Println("---")
case message.HeartBeat :
fmt.Println("Heartbeat")
fmt.Println(msg)
fmt.Println("---")
}
}
}
There are several types of channels to subscribe to aswell with their respectivly message types.
NOTE: this is not the same as an go channel. all messages will be posted to the same go channel that can
be accessed by client.Channel()
Channel type | Message type | Description |
---|---|---|
- | error |
Posted if an error occured on the client. There is no channel to subscribe to. error messages will always be posted. |
HeartbeatChannel |
HeartBeat |
Heartbeat message. Used to know if thalos is there or not if messages are not posted frequently on real channels. |
RollbackChannel |
RollbackMessage |
This message is posted if the chain has experienced a microfork. |
TransactionChannel |
TransactionTrace |
Information about an transaction |
ActionChannel |
ActionTrace |
Information about an action |
TableDeltaChannel |
TableDelta |
Information about an table change |