 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>
		
			
				
	
	
		
			181 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			181 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| package multiaddr
 | |
| 
 | |
| import "fmt"
 | |
| 
 | |
| // Split returns the sub-address portions of a multiaddr.
 | |
| func Split(m Multiaddr) []Multiaddr {
 | |
| 	if _, ok := m.(*Component); ok {
 | |
| 		return []Multiaddr{m}
 | |
| 	}
 | |
| 	var addrs []Multiaddr
 | |
| 	ForEach(m, func(c Component) bool {
 | |
| 		addrs = append(addrs, &c)
 | |
| 		return true
 | |
| 	})
 | |
| 	return addrs
 | |
| }
 | |
| 
 | |
| // Join returns a combination of addresses.
 | |
| func Join(ms ...Multiaddr) Multiaddr {
 | |
| 	switch len(ms) {
 | |
| 	case 0:
 | |
| 		// empty multiaddr, unfortunately, we have callers that rely on
 | |
| 		// this contract.
 | |
| 		return &multiaddr{}
 | |
| 	case 1:
 | |
| 		return ms[0]
 | |
| 	}
 | |
| 
 | |
| 	length := 0
 | |
| 	bs := make([][]byte, len(ms))
 | |
| 	for i, m := range ms {
 | |
| 		bs[i] = m.Bytes()
 | |
| 		length += len(bs[i])
 | |
| 	}
 | |
| 
 | |
| 	bidx := 0
 | |
| 	b := make([]byte, length)
 | |
| 	for _, mb := range bs {
 | |
| 		bidx += copy(b[bidx:], mb)
 | |
| 	}
 | |
| 	return &multiaddr{bytes: b}
 | |
| }
 | |
| 
 | |
| // Cast re-casts a byte slice as a multiaddr. will panic if it fails to parse.
 | |
| func Cast(b []byte) Multiaddr {
 | |
| 	m, err := NewMultiaddrBytes(b)
 | |
| 	if err != nil {
 | |
| 		panic(fmt.Errorf("multiaddr failed to parse: %s", err))
 | |
| 	}
 | |
| 	return m
 | |
| }
 | |
| 
 | |
| // StringCast like Cast, but parses a string. Will also panic if it fails to parse.
 | |
| func StringCast(s string) Multiaddr {
 | |
| 	m, err := NewMultiaddr(s)
 | |
| 	if err != nil {
 | |
| 		panic(fmt.Errorf("multiaddr failed to parse: %s", err))
 | |
| 	}
 | |
| 	return m
 | |
| }
 | |
| 
 | |
| // SplitFirst returns the first component and the rest of the multiaddr.
 | |
| func SplitFirst(m Multiaddr) (*Component, Multiaddr) {
 | |
| 	// Shortcut if we already have a component
 | |
| 	if c, ok := m.(*Component); ok {
 | |
| 		return c, nil
 | |
| 	}
 | |
| 
 | |
| 	b := m.Bytes()
 | |
| 	if len(b) == 0 {
 | |
| 		return nil, nil
 | |
| 	}
 | |
| 	n, c, err := readComponent(b)
 | |
| 	if err != nil {
 | |
| 		panic(err)
 | |
| 	}
 | |
| 	if len(b) == n {
 | |
| 		return &c, nil
 | |
| 	}
 | |
| 	return &c, &multiaddr{b[n:]}
 | |
| }
 | |
| 
 | |
| // SplitLast returns the rest of the multiaddr and the last component.
 | |
| func SplitLast(m Multiaddr) (Multiaddr, *Component) {
 | |
| 	// Shortcut if we already have a component
 | |
| 	if c, ok := m.(*Component); ok {
 | |
| 		return nil, c
 | |
| 	}
 | |
| 
 | |
| 	b := m.Bytes()
 | |
| 	if len(b) == 0 {
 | |
| 		return nil, nil
 | |
| 	}
 | |
| 
 | |
| 	var (
 | |
| 		c      Component
 | |
| 		err    error
 | |
| 		offset int
 | |
| 	)
 | |
| 	for {
 | |
| 		var n int
 | |
| 		n, c, err = readComponent(b[offset:])
 | |
| 		if err != nil {
 | |
| 			panic(err)
 | |
| 		}
 | |
| 		if len(b) == n+offset {
 | |
| 			// Reached end
 | |
| 			if offset == 0 {
 | |
| 				// Only one component
 | |
| 				return nil, &c
 | |
| 			}
 | |
| 			return &multiaddr{b[:offset]}, &c
 | |
| 		}
 | |
| 		offset += n
 | |
| 	}
 | |
| }
 | |
| 
 | |
| // SplitFunc splits the multiaddr when the callback first returns true. The
 | |
| // component on which the callback first returns will be included in the
 | |
| // *second* multiaddr.
 | |
| func SplitFunc(m Multiaddr, cb func(Component) bool) (Multiaddr, Multiaddr) {
 | |
| 	// Shortcut if we already have a component
 | |
| 	if c, ok := m.(*Component); ok {
 | |
| 		if cb(*c) {
 | |
| 			return nil, m
 | |
| 		}
 | |
| 		return m, nil
 | |
| 	}
 | |
| 	b := m.Bytes()
 | |
| 	if len(b) == 0 {
 | |
| 		return nil, nil
 | |
| 	}
 | |
| 	var (
 | |
| 		c      Component
 | |
| 		err    error
 | |
| 		offset int
 | |
| 	)
 | |
| 	for offset < len(b) {
 | |
| 		var n int
 | |
| 		n, c, err = readComponent(b[offset:])
 | |
| 		if err != nil {
 | |
| 			panic(err)
 | |
| 		}
 | |
| 		if cb(c) {
 | |
| 			break
 | |
| 		}
 | |
| 		offset += n
 | |
| 	}
 | |
| 	switch offset {
 | |
| 	case 0:
 | |
| 		return nil, m
 | |
| 	case len(b):
 | |
| 		return m, nil
 | |
| 	default:
 | |
| 		return &multiaddr{b[:offset]}, &multiaddr{b[offset:]}
 | |
| 	}
 | |
| }
 | |
| 
 | |
| // ForEach walks over the multiaddr, component by component.
 | |
| //
 | |
| // This function iterates over components *by value* to avoid allocating.
 | |
| func ForEach(m Multiaddr, cb func(c Component) bool) {
 | |
| 	// Shortcut if we already have a component
 | |
| 	if c, ok := m.(*Component); ok {
 | |
| 		cb(*c)
 | |
| 		return
 | |
| 	}
 | |
| 
 | |
| 	b := m.Bytes()
 | |
| 	for len(b) > 0 {
 | |
| 		n, c, err := readComponent(b)
 | |
| 		if err != nil {
 | |
| 			panic(err)
 | |
| 		}
 | |
| 		if !cb(c) {
 | |
| 			return
 | |
| 		}
 | |
| 		b = b[n:]
 | |
| 	}
 | |
| }
 |