github.com/zignig/go-ipfs@v0.0.0-20141111235910-c9e5fdf55a52/namesys/namesys.go (about)

     1  package namesys
     2  
     3  import (
     4  	ci "github.com/jbenet/go-ipfs/crypto"
     5  	routing "github.com/jbenet/go-ipfs/routing"
     6  )
     7  
     8  // ipnsNameSystem implements IPNS naming.
     9  //
    10  // Uses three Resolvers:
    11  // (a) ipfs routing naming: SFS-like PKI names.
    12  // (b) dns domains: resolves using links in DNS TXT records
    13  // (c) proquints: interprets string as the raw byte data.
    14  //
    15  // It can only publish to: (a) ipfs routing naming.
    16  //
    17  type ipns struct {
    18  	resolvers []Resolver
    19  	publisher Publisher
    20  }
    21  
    22  // NewNameSystem will construct the IPFS naming system based on Routing
    23  func NewNameSystem(r routing.IpfsRouting) NameSystem {
    24  	return &ipns{
    25  		resolvers: []Resolver{
    26  			new(DNSResolver),
    27  			new(ProquintResolver),
    28  			NewRoutingResolver(r),
    29  		},
    30  		publisher: NewRoutingPublisher(r),
    31  	}
    32  }
    33  
    34  // Resolve implements Resolver
    35  func (ns *ipns) Resolve(name string) (string, error) {
    36  	for _, r := range ns.resolvers {
    37  		if r.CanResolve(name) {
    38  			return r.Resolve(name)
    39  		}
    40  	}
    41  	return "", ErrResolveFailed
    42  }
    43  
    44  // CanResolve implements Resolver
    45  func (ns *ipns) CanResolve(name string) bool {
    46  	for _, r := range ns.resolvers {
    47  		if r.CanResolve(name) {
    48  			return true
    49  		}
    50  	}
    51  	return false
    52  }
    53  
    54  // Publish implements Publisher
    55  func (ns *ipns) Publish(name ci.PrivKey, value string) error {
    56  	return ns.publisher.Publish(name, value)
    57  }