 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>
		
			
				
	
	
		
			79 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			79 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| package web
 | |
| 
 | |
| import (
 | |
| 	"embed"
 | |
| 	"net/http"
 | |
| 	"strings"
 | |
| )
 | |
| 
 | |
| // Static files embedded at build time
 | |
| //go:embed static
 | |
| //go:embed static/_next
 | |
| //go:embed static/_next/static
 | |
| //go:embed static/_next/static/css
 | |
| //go:embed static/_next/static/chunks
 | |
| var staticFiles embed.FS
 | |
| 
 | |
| // GetWebUIHandler returns HTTP handler for embedded web UI
 | |
| func GetWebUIHandler() http.Handler {
 | |
| 	// Use the embedded files directly (no static subdirectory)
 | |
| 	staticFS := staticFiles
 | |
| 	_, err := staticFiles.ReadFile("static/index.html")
 | |
| 	if err != nil {
 | |
| 		// Fallback to empty filesystem if no static files
 | |
| 		return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
 | |
| 			w.Header().Set("Content-Type", "text/html")
 | |
| 			w.WriteHeader(200)
 | |
| 			w.Write([]byte(`
 | |
| <!DOCTYPE html>
 | |
| <html>
 | |
| <head><title>CHORUS Setup</title></head>
 | |
| <body>
 | |
|     <h1>CHORUS Setup</h1>
 | |
|     <p>Web UI not yet built. Please build the React app first.</p>
 | |
|     <p>Run: <code>cd install/config-ui && npm run build</code></p>
 | |
| </body>
 | |
| </html>
 | |
| 			`))
 | |
| 		})
 | |
| 	}
 | |
| 	
 | |
| 	return http.FileServer(http.FS(staticFS))
 | |
| }
 | |
| 
 | |
| // IsEmbeddedFileAvailable checks if a file exists in the embedded filesystem
 | |
| func IsEmbeddedFileAvailable(path string) bool {
 | |
| 	path = strings.TrimPrefix(path, "/")
 | |
| 	if path == "" {
 | |
| 		path = "index.html"
 | |
| 	}
 | |
| 	_, err := staticFiles.ReadFile("static/" + path)
 | |
| 	return err == nil
 | |
| }
 | |
| 
 | |
| // ServeEmbeddedFile serves a file from the embedded filesystem
 | |
| func ServeEmbeddedFile(w http.ResponseWriter, r *http.Request, path string) {
 | |
| 	path = strings.TrimPrefix(path, "/")
 | |
| 	if path == "" {
 | |
| 		path = "index.html"
 | |
| 	}
 | |
| 	
 | |
| 	content, err := staticFiles.ReadFile("static/" + path)
 | |
| 	if err != nil {
 | |
| 		http.NotFound(w, r)
 | |
| 		return
 | |
| 	}
 | |
| 	
 | |
| 	// Set content type based on file extension
 | |
| 	contentType := "text/html"
 | |
| 	if strings.HasSuffix(path, ".js") {
 | |
| 		contentType = "application/javascript"
 | |
| 	} else if strings.HasSuffix(path, ".css") {
 | |
| 		contentType = "text/css"
 | |
| 	} else if strings.HasSuffix(path, ".json") {
 | |
| 		contentType = "application/json"
 | |
| 	}
 | |
| 	
 | |
| 	w.Header().Set("Content-Type", contentType)
 | |
| 	w.Write(content)
 | |
| } |