You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
60 lines
1.1 KiB
60 lines
1.1 KiB
package crosslink_sending
|
|
|
|
import (
|
|
"github.com/woop-chain/woop/core"
|
|
"github.com/woop-chain/woop/shard"
|
|
)
|
|
|
|
type broadcast interface {
|
|
BroadcastCrosslinkHeartbeatSignalFromBeaconToShards()
|
|
BroadcastCrossLinkFromShardsToBeacon()
|
|
}
|
|
|
|
type Service struct {
|
|
node broadcast
|
|
bc core.BlockChain
|
|
ch chan core.ChainEvent
|
|
closeCh chan struct{}
|
|
beacon bool
|
|
}
|
|
|
|
func New(node broadcast, bc core.BlockChain) *Service {
|
|
return &Service{
|
|
node: node,
|
|
bc: bc,
|
|
ch: make(chan core.ChainEvent, 1),
|
|
closeCh: make(chan struct{}),
|
|
beacon: bc.ShardID() == shard.BeaconChainShardID,
|
|
}
|
|
}
|
|
|
|
// Start starts service.
|
|
func (s *Service) Start() error {
|
|
s.bc.SubscribeChainEvent(s.ch)
|
|
go s.run()
|
|
return nil
|
|
}
|
|
|
|
func (s *Service) run() {
|
|
for {
|
|
select {
|
|
case _, ok := <-s.ch:
|
|
if !ok {
|
|
return
|
|
}
|
|
if s.beacon {
|
|
go s.node.BroadcastCrosslinkHeartbeatSignalFromBeaconToShards()
|
|
} else {
|
|
go s.node.BroadcastCrossLinkFromShardsToBeacon()
|
|
}
|
|
case <-s.closeCh:
|
|
return
|
|
}
|
|
}
|
|
}
|
|
|
|
// Stop stops service.
|
|
func (s *Service) Stop() error {
|
|
close(s.closeCh)
|
|
return nil
|
|
}
|
|
|