github.com/igggame/nebulas-go@v2.1.0+incompatible/net/net_service.go (about)

     1  // Copyright (C) 2017 go-nebulas authors
     2  //
     3  // This file is part of the go-nebulas library.
     4  //
     5  // the go-nebulas library is free software: you can redistribute it and/or modify
     6  // it under the terms of the GNU General Public License as published by
     7  // the Free Software Foundation, either version 3 of the License, or
     8  // (at your option) any later version.
     9  //
    10  // the go-nebulas library is distributed in the hope that it will be useful,
    11  // but WITHOUT ANY WARRANTY; without even the implied warranty of
    12  // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    13  // GNU General Public License for more details.
    14  //
    15  // You should have received a copy of the GNU General Public License
    16  // along with the go-nebulas library.  If not, see <http://www.gnu.org/licenses/>.
    17  //
    18  
    19  package net
    20  
    21  import (
    22  	"github.com/nebulasio/go-nebulas/util/logging"
    23  	"github.com/sirupsen/logrus"
    24  )
    25  
    26  // NebService service for nebulas p2p network
    27  type NebService struct {
    28  	node       *Node
    29  	dispatcher *Dispatcher
    30  }
    31  
    32  // NewNebService create netService
    33  func NewNebService(n Neblet) (*NebService, error) {
    34  	if networkConf := n.Config().GetNetwork(); networkConf == nil {
    35  		logging.CLog().Fatal("Failed to find network config in config file")
    36  		return nil, ErrConfigLackNetWork
    37  	}
    38  	node, err := NewNode(NewP2PConfig(n))
    39  	if err != nil {
    40  		return nil, err
    41  	}
    42  
    43  	ns := &NebService{
    44  		node:       node,
    45  		dispatcher: NewDispatcher(),
    46  	}
    47  	node.SetNebService(ns)
    48  
    49  	return ns, nil
    50  }
    51  
    52  // Node return the peer node
    53  func (ns *NebService) Node() *Node {
    54  	return ns.node
    55  }
    56  
    57  // Start start p2p manager.
    58  func (ns *NebService) Start() error {
    59  	logging.CLog().Info("Starting NebService...")
    60  
    61  	// start dispatcher.
    62  	ns.dispatcher.Start()
    63  
    64  	// start node.
    65  	if err := ns.node.Start(); err != nil {
    66  		ns.dispatcher.Stop()
    67  		logging.CLog().WithFields(logrus.Fields{
    68  			"err": err,
    69  		}).Error("Failed to start NebService.")
    70  		return err
    71  	}
    72  
    73  	logging.CLog().Info("Started NebService.")
    74  	return nil
    75  }
    76  
    77  // Stop stop p2p manager.
    78  func (ns *NebService) Stop() {
    79  	logging.CLog().Info("Stopping NebService...")
    80  
    81  	ns.node.Stop()
    82  	ns.dispatcher.Stop()
    83  }
    84  
    85  // Register register the subscribers.
    86  func (ns *NebService) Register(subscribers ...*Subscriber) {
    87  	ns.dispatcher.Register(subscribers...)
    88  }
    89  
    90  // Deregister Deregister the subscribers.
    91  func (ns *NebService) Deregister(subscribers ...*Subscriber) {
    92  	ns.dispatcher.Deregister(subscribers...)
    93  }
    94  
    95  // PutMessage put message to dispatcher.
    96  func (ns *NebService) PutMessage(msg Message) {
    97  	ns.dispatcher.PutMessage(msg)
    98  }
    99  
   100  // Broadcast message.
   101  func (ns *NebService) Broadcast(name string, msg Serializable, priority int) {
   102  	ns.node.BroadcastMessage(name, msg, priority)
   103  }
   104  
   105  // Relay message.
   106  func (ns *NebService) Relay(name string, msg Serializable, priority int) {
   107  	ns.node.RelayMessage(name, msg, priority)
   108  }
   109  
   110  // BroadcastNetworkID broadcast networkID when changed.
   111  func (ns *NebService) BroadcastNetworkID(msg []byte) {
   112  	// TODO: @robin networkID.
   113  }
   114  
   115  // SendMsg send message to a peer.
   116  func (ns *NebService) SendMsg(msgName string, msg []byte, target string, priority int) error {
   117  	return ns.node.SendMessageToPeer(msgName, msg, priority, target)
   118  }
   119  
   120  // SendMessageToPeers send message to peers.
   121  func (ns *NebService) SendMessageToPeers(messageName string, data []byte, priority int, filter PeerFilterAlgorithm) []string {
   122  	return ns.node.streamManager.SendMessageToPeers(messageName, data, priority, filter)
   123  }
   124  
   125  // SendMessageToPeer send message to a peer.
   126  func (ns *NebService) SendMessageToPeer(messageName string, data []byte, priority int, peerID string) error {
   127  	return ns.node.SendMessageToPeer(messageName, data, priority, peerID)
   128  }
   129  
   130  // ClosePeer close the stream to a peer.
   131  func (ns *NebService) ClosePeer(peerID string, reason error) {
   132  	ns.node.streamManager.CloseStream(peerID, reason)
   133  }