 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>
		
			
				
	
	
		
			198 lines
		
	
	
		
			5.6 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			198 lines
		
	
	
		
			5.6 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| package basicnode
 | |
| 
 | |
| import (
 | |
| 	"github.com/ipld/go-ipld-prime/datamodel"
 | |
| 	"github.com/ipld/go-ipld-prime/linking"
 | |
| )
 | |
| 
 | |
| var (
 | |
| 	//_ datamodel.Node          = &anyNode{}
 | |
| 	_ datamodel.NodePrototype = Prototype__Any{}
 | |
| 	_ datamodel.NodeBuilder   = &anyBuilder{}
 | |
| 	//_ datamodel.NodeAssembler = &anyAssembler{}
 | |
| )
 | |
| 
 | |
| // Note that we don't use a "var _" declaration to assert that Chooser
 | |
| // implements traversal.LinkTargetNodePrototypeChooser, to keep basicnode's
 | |
| // dependencies fairly light.
 | |
| 
 | |
| // Chooser implements traversal.LinkTargetNodePrototypeChooser.
 | |
| //
 | |
| // It can be used directly when loading links into the "any" prototype,
 | |
| // or with another chooser layer on top, such as:
 | |
| //
 | |
| //	prototypeChooser := dagpb.AddSupportToChooser(basicnode.Chooser)
 | |
| func Chooser(_ datamodel.Link, _ linking.LinkContext) (datamodel.NodePrototype, error) {
 | |
| 	return Prototype.Any, nil
 | |
| }
 | |
| 
 | |
| // -- Node interface methods -->
 | |
| 
 | |
| // Unimplemented at present -- see "REVIEW" comment on anyNode.
 | |
| 
 | |
| // -- NodePrototype -->
 | |
| 
 | |
| type Prototype__Any struct{}
 | |
| 
 | |
| func (Prototype__Any) NewBuilder() datamodel.NodeBuilder {
 | |
| 	return &anyBuilder{}
 | |
| }
 | |
| 
 | |
| // -- NodeBuilder -->
 | |
| 
 | |
| // anyBuilder is a builder for any kind of node.
 | |
| //
 | |
| // anyBuilder is a little unusual in its internal workings:
 | |
| // unlike most builders, it doesn't embed the corresponding assembler,
 | |
| // nor will it end up using anyNode,
 | |
| // but instead embeds a builder for each of the kinds it might contain.
 | |
| // This is because we want a more granular return at the end:
 | |
| // if we used anyNode, and returned a pointer to just the relevant part of it,
 | |
| // we'd have all the extra bytes of anyNode still reachable in GC terms
 | |
| // for as long as that handle to the interior of it remains live.
 | |
| type anyBuilder struct {
 | |
| 	// kind is set on first interaction, and used to select which builder to delegate 'Build' to!
 | |
| 	// As soon as it's been set to a value other than zero (being "Invalid"), all other Assign/Begin calls will fail since something is already in progress.
 | |
| 	// May also be set to the magic value '99', which means "i dunno, I'm just carrying another node of unknown prototype".
 | |
| 	kind datamodel.Kind
 | |
| 
 | |
| 	// Only one of the following ends up being used...
 | |
| 	//  but we don't know in advance which one, so all are embeded here.
 | |
| 	//   This uses excessive space, but amortizes allocations, and all will be
 | |
| 	//    freed as soon as the builder is done.
 | |
| 	// Builders are only used for recursives;
 | |
| 	//  scalars are simple enough we just do them directly.
 | |
| 	// 'scalarNode' may also hold another Node of unknown prototype (possibly not even from this package),
 | |
| 	//  in which case this is indicated by 'kind==99'.
 | |
| 
 | |
| 	mapBuilder  plainMap__Builder
 | |
| 	listBuilder plainList__Builder
 | |
| 	scalarNode  datamodel.Node
 | |
| }
 | |
| 
 | |
| func (nb *anyBuilder) Reset() {
 | |
| 	*nb = anyBuilder{}
 | |
| }
 | |
| 
 | |
| func (nb *anyBuilder) BeginMap(sizeHint int64) (datamodel.MapAssembler, error) {
 | |
| 	if nb.kind != datamodel.Kind_Invalid {
 | |
| 		panic("misuse")
 | |
| 	}
 | |
| 	nb.kind = datamodel.Kind_Map
 | |
| 	nb.mapBuilder.w = &plainMap{}
 | |
| 	return nb.mapBuilder.BeginMap(sizeHint)
 | |
| }
 | |
| func (nb *anyBuilder) BeginList(sizeHint int64) (datamodel.ListAssembler, error) {
 | |
| 	if nb.kind != datamodel.Kind_Invalid {
 | |
| 		panic("misuse")
 | |
| 	}
 | |
| 	nb.kind = datamodel.Kind_List
 | |
| 	nb.listBuilder.w = &plainList{}
 | |
| 	return nb.listBuilder.BeginList(sizeHint)
 | |
| }
 | |
| func (nb *anyBuilder) AssignNull() error {
 | |
| 	if nb.kind != datamodel.Kind_Invalid {
 | |
| 		panic("misuse")
 | |
| 	}
 | |
| 	nb.kind = datamodel.Kind_Null
 | |
| 	return nil
 | |
| }
 | |
| func (nb *anyBuilder) AssignBool(v bool) error {
 | |
| 	if nb.kind != datamodel.Kind_Invalid {
 | |
| 		panic("misuse")
 | |
| 	}
 | |
| 	nb.kind = datamodel.Kind_Bool
 | |
| 	nb.scalarNode = NewBool(v)
 | |
| 	return nil
 | |
| }
 | |
| func (nb *anyBuilder) AssignInt(v int64) error {
 | |
| 	if nb.kind != datamodel.Kind_Invalid {
 | |
| 		panic("misuse")
 | |
| 	}
 | |
| 	nb.kind = datamodel.Kind_Int
 | |
| 	nb.scalarNode = NewInt(v)
 | |
| 	return nil
 | |
| }
 | |
| func (nb *anyBuilder) AssignFloat(v float64) error {
 | |
| 	if nb.kind != datamodel.Kind_Invalid {
 | |
| 		panic("misuse")
 | |
| 	}
 | |
| 	nb.kind = datamodel.Kind_Float
 | |
| 	nb.scalarNode = NewFloat(v)
 | |
| 	return nil
 | |
| }
 | |
| func (nb *anyBuilder) AssignString(v string) error {
 | |
| 	if nb.kind != datamodel.Kind_Invalid {
 | |
| 		panic("misuse")
 | |
| 	}
 | |
| 	nb.kind = datamodel.Kind_String
 | |
| 	nb.scalarNode = NewString(v)
 | |
| 	return nil
 | |
| }
 | |
| func (nb *anyBuilder) AssignBytes(v []byte) error {
 | |
| 	if nb.kind != datamodel.Kind_Invalid {
 | |
| 		panic("misuse")
 | |
| 	}
 | |
| 	nb.kind = datamodel.Kind_Bytes
 | |
| 	nb.scalarNode = NewBytes(v)
 | |
| 	return nil
 | |
| }
 | |
| func (nb *anyBuilder) AssignLink(v datamodel.Link) error {
 | |
| 	if nb.kind != datamodel.Kind_Invalid {
 | |
| 		panic("misuse")
 | |
| 	}
 | |
| 	nb.kind = datamodel.Kind_Link
 | |
| 	nb.scalarNode = NewLink(v)
 | |
| 	return nil
 | |
| }
 | |
| func (nb *anyBuilder) AssignNode(v datamodel.Node) error {
 | |
| 	if nb.kind != datamodel.Kind_Invalid {
 | |
| 		panic("misuse")
 | |
| 	}
 | |
| 	nb.kind = 99
 | |
| 	nb.scalarNode = v
 | |
| 	return nil
 | |
| }
 | |
| func (anyBuilder) Prototype() datamodel.NodePrototype {
 | |
| 	return Prototype.Any
 | |
| }
 | |
| 
 | |
| func (nb *anyBuilder) Build() datamodel.Node {
 | |
| 	switch nb.kind {
 | |
| 	case datamodel.Kind_Invalid:
 | |
| 		panic("misuse")
 | |
| 	case datamodel.Kind_Map:
 | |
| 		return nb.mapBuilder.Build()
 | |
| 	case datamodel.Kind_List:
 | |
| 		return nb.listBuilder.Build()
 | |
| 	case datamodel.Kind_Null:
 | |
| 		return datamodel.Null
 | |
| 	case datamodel.Kind_Bool:
 | |
| 		return nb.scalarNode
 | |
| 	case datamodel.Kind_Int:
 | |
| 		return nb.scalarNode
 | |
| 	case datamodel.Kind_Float:
 | |
| 		return nb.scalarNode
 | |
| 	case datamodel.Kind_String:
 | |
| 		return nb.scalarNode
 | |
| 	case datamodel.Kind_Bytes:
 | |
| 		return nb.scalarNode
 | |
| 	case datamodel.Kind_Link:
 | |
| 		return nb.scalarNode
 | |
| 	case 99:
 | |
| 		return nb.scalarNode
 | |
| 	default:
 | |
| 		panic("unreachable")
 | |
| 	}
 | |
| }
 | |
| 
 | |
| // -- NodeAssembler -->
 | |
| 
 | |
| // ... oddly enough, we seem to be able to put off implementing this
 | |
| //  until we also implement something that goes full-hog on amortization
 | |
| //   and actually has a slab of `anyNode`.  Which so far, nothing does.
 | |
| //    See "REVIEW" comment on anyNode.
 | |
| // type anyAssembler struct {
 | |
| // 	w *anyNode
 | |
| // }
 |