 9bdcbe0447
			
		
	
	9bdcbe0447
	
	
	
		
			
			Major integrations and fixes: - Added BACKBEAT SDK integration for P2P operation timing - Implemented beat-aware status tracking for distributed operations - Added Docker secrets support for secure license management - Resolved KACHING license validation via HTTPS/TLS - Updated docker-compose configuration for clean stack deployment - Disabled rollback policies to prevent deployment failures - Added license credential storage (CHORUS-DEV-MULTI-001) Technical improvements: - BACKBEAT P2P operation tracking with phase management - Enhanced configuration system with file-based secrets - Improved error handling for license validation - Clean separation of KACHING and CHORUS deployment stacks 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
		
			
				
	
	
		
			77 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			77 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| package cidlink
 | |
| 
 | |
| import (
 | |
| 	"fmt"
 | |
| 
 | |
| 	cid "github.com/ipfs/go-cid"
 | |
| 	"github.com/ipld/go-ipld-prime/datamodel"
 | |
| 	multihash "github.com/multiformats/go-multihash"
 | |
| )
 | |
| 
 | |
| var (
 | |
| 	_ datamodel.Link          = Link{}
 | |
| 	_ datamodel.LinkPrototype = LinkPrototype{}
 | |
| )
 | |
| 
 | |
| // Link implements the datamodel.Link interface using a CID.
 | |
| // See https://github.com/ipfs/go-cid for more information about CIDs.
 | |
| //
 | |
| // When using this value, typically you'll use it as `Link`, and not `*Link`.
 | |
| // This includes when handling the value as an `datamodel.Link` interface -- the non-pointer form is typically preferable.
 | |
| // This is because the datamodel.Link inteface is often desirable to be able to use as a golang map key,
 | |
| // and in that context, pointers would not result in the desired behavior.
 | |
| type Link struct {
 | |
| 	cid.Cid
 | |
| }
 | |
| 
 | |
| func (lnk Link) Prototype() datamodel.LinkPrototype {
 | |
| 	return LinkPrototype{lnk.Cid.Prefix()}
 | |
| }
 | |
| func (lnk Link) String() string {
 | |
| 	return lnk.Cid.String()
 | |
| }
 | |
| func (lnk Link) Binary() string {
 | |
| 	return lnk.Cid.KeyString()
 | |
| }
 | |
| 
 | |
| type LinkPrototype struct {
 | |
| 	cid.Prefix
 | |
| }
 | |
| 
 | |
| func (lp LinkPrototype) BuildLink(hashsum []byte) datamodel.Link {
 | |
| 	// Does this method body look surprisingly complex?  I agree.
 | |
| 	//  We actually have to do all this work.  The go-cid package doesn't expose a constructor that just lets us directly set the bytes and the prefix numbers next to each other.
 | |
| 	//  No, `cid.Prefix.Sum` is not the method you are looking for: that expects the whole data body.
 | |
| 	//  Most of the logic here is the same as the body of `cid.Prefix.Sum`; we just couldn't get at the relevant parts without copypasta.
 | |
| 	//  There is also some logic that's sort of folded in from the go-multihash module.  This is really a mess.
 | |
| 	//  The go-cid package needs review.  So does go-multihash.  Their responsibilies are not well compartmentalized and they don't play well with other stdlib golang interfaces.
 | |
| 	p := lp.Prefix
 | |
| 
 | |
| 	length := p.MhLength
 | |
| 	if p.MhType == multihash.IDENTITY {
 | |
| 		length = -1
 | |
| 	}
 | |
| 	if p.Version == 0 && (p.MhType != multihash.SHA2_256 ||
 | |
| 		(p.MhLength != 32 && p.MhLength != -1)) {
 | |
| 		panic(fmt.Errorf("invalid cid v0 prefix"))
 | |
| 	}
 | |
| 
 | |
| 	if length != -1 {
 | |
| 		hashsum = hashsum[:p.MhLength]
 | |
| 	}
 | |
| 
 | |
| 	mh, err := multihash.Encode(hashsum, p.MhType)
 | |
| 	if err != nil {
 | |
| 		panic(err) // No longer possible, but multihash still returns an error for legacy reasons.
 | |
| 	}
 | |
| 
 | |
| 	switch lp.Prefix.Version {
 | |
| 	case 0:
 | |
| 		return Link{cid.NewCidV0(mh)}
 | |
| 	case 1:
 | |
| 		return Link{cid.NewCidV1(p.Codec, mh)}
 | |
| 	default:
 | |
| 		panic(fmt.Errorf("invalid cid version"))
 | |
| 	}
 | |
| }
 |