func (n *IpfsNode) startOnlineServices(ctx context.Context, routingOption RoutingOption, hostOption HostOption, do DiscoveryOption) error { if n.PeerHost != nil { // already online. return errors.New("node already online") } // load private key if err := n.LoadPrivateKey(); err != nil { return err } // Set reporter n.Reporter = metrics.NewBandwidthCounter() // get undialable addrs from config cfg, err := n.Repo.Config() if err != nil { return err } var addrfilter []*net.IPNet for _, s := range cfg.Swarm.AddrFilters { f, err := mamask.NewMask(s) if err != nil { return fmt.Errorf("incorrectly formatted address filter in config: %s", s) } addrfilter = append(addrfilter, f) } peerhost, err := hostOption(ctx, n.Identity, n.Peerstore, n.Reporter, addrfilter) if err != nil { return err } if err := n.startOnlineServicesWithHost(ctx, peerhost, routingOption); err != nil { return err } // Ok, now we're ready to listen. if err := startListening(ctx, n.PeerHost, cfg); err != nil { return err } n.Reprovider = rp.NewReprovider(n.Routing, n.Blockstore) go n.Reprovider.ProvideEvery(ctx, kReprovideFrequency) // setup local discovery if do != nil { service, err := do(n.PeerHost) if err != nil { log.Error("mdns error: ", err) } else { service.RegisterNotifee(n) n.Discovery = service } } return n.Bootstrap(DefaultBootstrapConfig) }
func GenSwarmNetwork(t *testing.T, ctx context.Context) *swarm.Network { p := tu.RandPeerNetParamsOrFatal(t) ps := peer.NewPeerstore() ps.AddPubKey(p.ID, p.PubKey) ps.AddPrivKey(p.ID, p.PrivKey) n, err := swarm.NewNetwork(ctx, []ma.Multiaddr{p.Addr}, p.ID, ps, metrics.NewBandwidthCounter()) if err != nil { t.Fatal(err) } ps.AddAddrs(p.ID, n.ListenAddresses(), peer.PermanentAddrTTL) return n }
// New constructs and sets up a new *BasicHost with given Network func New(net inet.Network, opts ...interface{}) *BasicHost { h := &BasicHost{ network: net, mux: msmux.NewMultistreamMuxer(), bwc: metrics.NewBandwidthCounter(), } h.proc = goprocess.WithTeardown(func() error { if h.natmgr != nil { h.natmgr.Close() } return h.Network().Close() }) // setup host services h.ids = identify.NewIDService(h) muxh := h.Mux().Handle handle := func(s inet.Stream) { muxh(s) } h.relay = relay.NewRelayService(h, handle) for _, o := range opts { switch o := o.(type) { case Option: switch o { case NATPortMap: h.natmgr = newNatManager(h) } case metrics.Reporter: h.bwc = o } } net.SetConnHandler(h.newConnHandler) net.SetStreamHandler(h.newStreamHandler) return h }