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 }