 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>
		
			
				
	
	
		
			67 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			67 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| package sprig
 | |
| 
 | |
| import (
 | |
| 	"fmt"
 | |
| 	"net/url"
 | |
| 	"reflect"
 | |
| )
 | |
| 
 | |
| func dictGetOrEmpty(dict map[string]interface{}, key string) string {
 | |
| 	value, ok := dict[key]
 | |
| 	if !ok {
 | |
| 		return ""
 | |
| 	}
 | |
| 	tp := reflect.TypeOf(value).Kind()
 | |
| 	if tp != reflect.String {
 | |
| 		panic(fmt.Sprintf("unable to parse %s key, must be of type string, but %s found", key, tp.String()))
 | |
| 	}
 | |
| 	return reflect.ValueOf(value).String()
 | |
| }
 | |
| 
 | |
| // parses given URL to return dict object
 | |
| func urlParse(v string) map[string]interface{} {
 | |
| 	dict := map[string]interface{}{}
 | |
| 	parsedURL, err := url.Parse(v)
 | |
| 	if err != nil {
 | |
| 		panic(fmt.Sprintf("unable to parse url: %s", err))
 | |
| 	}
 | |
| 	dict["scheme"] = parsedURL.Scheme
 | |
| 	dict["host"] = parsedURL.Host
 | |
| 	dict["hostname"] = parsedURL.Hostname()
 | |
| 	dict["path"] = parsedURL.Path
 | |
| 	dict["query"] = parsedURL.RawQuery
 | |
| 	dict["opaque"] = parsedURL.Opaque
 | |
| 	dict["fragment"] = parsedURL.Fragment
 | |
| 	if parsedURL.User != nil {
 | |
| 		dict["userinfo"] = parsedURL.User.String()
 | |
| 	} else {
 | |
| 		dict["userinfo"] = ""
 | |
| 	}
 | |
| 
 | |
| 	return dict
 | |
| }
 | |
| 
 | |
| // join given dict to URL string
 | |
| func urlJoin(d map[string]interface{}) string {
 | |
| 	resURL := url.URL{
 | |
| 		Scheme:   dictGetOrEmpty(d, "scheme"),
 | |
| 		Host:     dictGetOrEmpty(d, "host"),
 | |
| 		Path:     dictGetOrEmpty(d, "path"),
 | |
| 		RawQuery: dictGetOrEmpty(d, "query"),
 | |
| 		Opaque:   dictGetOrEmpty(d, "opaque"),
 | |
| 		Fragment: dictGetOrEmpty(d, "fragment"),
 | |
| 	}
 | |
| 	userinfo := dictGetOrEmpty(d, "userinfo")
 | |
| 	var user *url.Userinfo
 | |
| 	if userinfo != "" {
 | |
| 		tempURL, err := url.Parse(fmt.Sprintf("proto://%s@host", userinfo))
 | |
| 		if err != nil {
 | |
| 			panic(fmt.Sprintf("unable to parse userinfo in dict: %s", err))
 | |
| 		}
 | |
| 		user = tempURL.User
 | |
| 	}
 | |
| 
 | |
| 	resURL.User = user
 | |
| 	return resURL.String()
 | |
| }
 |