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.