package corerouting import ( "errors" ds "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore" context "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" core "github.com/ipfs/go-ipfs/core" "github.com/ipfs/go-ipfs/p2p/host" "github.com/ipfs/go-ipfs/p2p/peer" routing "github.com/ipfs/go-ipfs/routing" supernode "github.com/ipfs/go-ipfs/routing/supernode" gcproxy "github.com/ipfs/go-ipfs/routing/supernode/proxy" ) // NB: DHT option is included in the core to avoid 1) because it's a sane // default and 2) to avoid a circular dependency (it needs to be referenced in // the core if it's going to be the default) var ( errHostMissing = errors.New("supernode routing client requires a Host component") errIdentityMissing = errors.New("supernode routing server requires a peer ID identity") errPeerstoreMissing = errors.New("supernode routing server requires a peerstore") errServersMissing = errors.New("supernode routing client requires at least 1 server peer") ) // SupernodeServer returns a configuration for a routing server that stores // routing records to the provided datastore. Only routing records are store in // the datastore. func SupernodeServer(recordSource ds.ThreadSafeDatastore) core.RoutingOption { return func(ctx context.Context, ph host.Host, dstore ds.ThreadSafeDatastore) (routing.IpfsRouting, error) { server, err := supernode.NewServer(recordSource, ph.Peerstore(), ph.ID()) if err != nil { return nil, err } proxy := &gcproxy.Loopback{ Handler: server, Local: ph.ID(), } ph.SetStreamHandler(gcproxy.ProtocolSNR, proxy.HandleStream) return supernode.NewClient(proxy, ph, ph.Peerstore(), ph.ID()) } } // TODO doc func SupernodeClient(remotes ...peer.PeerInfo) core.RoutingOption { return func(ctx context.Context, ph host.Host, dstore ds.ThreadSafeDatastore) (routing.IpfsRouting, error) { if len(remotes) < 1 { return nil, errServersMissing } proxy := gcproxy.Standard(ph, remotes) ph.SetStreamHandler(gcproxy.ProtocolSNR, proxy.HandleStream) return supernode.NewClient(proxy, ph, ph.Peerstore(), ph.ID()) } }