Documentation
      ¶
    
    
  
    
  
    Overview ¶
Example ¶
package main
import (
	"fmt"
	"math/rand"
	"github.com/rs/zerolog"
	splitterNetwork "github.com/onflow/flow-go/engine/common/splitter/network"
	"github.com/onflow/flow-go/model/flow"
	"github.com/onflow/flow-go/network"
	testnet "github.com/onflow/flow-go/utils/unittest/network"
)
func main() {
	// create a mock network
	net := testnet.NewNetwork()
	// create a splitter network
	logger := zerolog.Nop()
	splitterNet := splitterNetwork.NewNetwork(net, logger)
	// generate a random origin ID
	var id flow.Identifier
	rand.Seed(0)
	rand.Read(id[:])
	// create engines
	engineProcessFunc := func(engineID int) testnet.EngineProcessFunc {
		return func(channel network.Channel, originID flow.Identifier, event interface{}) error {
			fmt.Printf("Engine %d received message: channel=%v, originID=%v, event=%v\n", engineID, channel, originID, event)
			return nil
		}
	}
	engine1 := testnet.NewEngine().OnProcess(engineProcessFunc(1))
	engine2 := testnet.NewEngine().OnProcess(engineProcessFunc(2))
	engine3 := testnet.NewEngine().OnProcess(engineProcessFunc(3))
	// register engines with splitter network
	channel := network.Channel("foo-channel")
	_, err := splitterNet.Register(channel, engine1)
	if err != nil {
		fmt.Println(err)
	}
	_, err = splitterNet.Register(channel, engine2)
	if err != nil {
		fmt.Println(err)
	}
	_, err = splitterNet.Register(channel, engine3)
	if err != nil {
		fmt.Println(err)
	}
	// send message to network
	err = net.Send(channel, id, "foo")
	if err != nil {
		fmt.Println(err)
	}
}
Output: Engine 1 received message: channel=foo-channel, originID=0194fdc2fa2ffcc041d3ff12045b73c86e4ff95ff662a5eee82abdf44a2d0b75, event=foo Engine 2 received message: channel=foo-channel, originID=0194fdc2fa2ffcc041d3ff12045b73c86e4ff95ff662a5eee82abdf44a2d0b75, event=foo Engine 3 received message: channel=foo-channel, originID=0194fdc2fa2ffcc041d3ff12045b73c86e4ff95ff662a5eee82abdf44a2d0b75, event=foo
Index ¶
Examples ¶
Constants ¶
This section is empty.
Variables ¶
This section is empty.
Functions ¶
This section is empty.
Types ¶
type Network ¶
type Network struct {
	module.ReadyDoneAwareNetwork
	// contains filtered or unexported fields
}
    Network is the splitter network. It is a wrapper around the default network implementation and should be passed in to engine constructors that require a network to register with. When an engine is registered with the splitter network, a splitter engine is created for the given channel (if one doesn't already exist) and the engine is registered with that splitter engine. As a result, multiple engines can register with the splitter network on the same channel and will each receive all events on that channel.
func NewNetwork ¶
func NewNetwork( net module.ReadyDoneAwareNetwork, log zerolog.Logger, ) *Network
NewNetwork returns a new splitter network.
func (*Network) Done ¶
func (n *Network) Done() <-chan struct{}
Done returns a done channel that is closed once the network has fully stopped. For the splitter network, this is true once the wrapped network has stopped.
func (*Network) Ready ¶
func (n *Network) Ready() <-chan struct{}
Ready returns a ready channel that is closed once the network has fully started. For the splitter network, this is true once the wrapped network has started.