mirror of
https://github.com/luxfi/qzmq.git
synced 2026-10-30 15:20:19 +00:00
267 lines
6.5 KiB
Go
267 lines
6.5 KiB
Go
// Package qzmq provides backend selection for different build configurations
|
|
package qzmq
|
|
|
|
import (
|
|
"fmt"
|
|
"os"
|
|
"strings"
|
|
)
|
|
|
|
// BackendType represents the available backend implementations
|
|
type BackendType string
|
|
|
|
const (
|
|
// BackendStub uses in-memory stub (no external dependencies)
|
|
BackendStub BackendType = "stub"
|
|
|
|
// BackendPebbe uses pebbe/zmq4 (requires libzmq and CGO)
|
|
BackendPebbe BackendType = "pebbe"
|
|
|
|
// BackendLuxZMQ uses luxfi/zmq (custom Lux implementation)
|
|
BackendLuxZMQ BackendType = "luxzmq"
|
|
|
|
// BackendCZMQ uses CZMQ (advanced ZeroMQ binding)
|
|
BackendCZMQ BackendType = "czmq"
|
|
)
|
|
|
|
// DetectBackend detects which backend to use based on build tags and environment
|
|
func DetectBackend() BackendType {
|
|
// Check build tags via environment (set during build)
|
|
buildTags := os.Getenv("GO_BUILD_TAGS")
|
|
|
|
// Check for explicit backend selection
|
|
if backend := os.Getenv("QZMQ_BACKEND"); backend != "" {
|
|
switch strings.ToLower(backend) {
|
|
case "stub":
|
|
return BackendStub
|
|
case "pebbe":
|
|
return BackendPebbe
|
|
case "luxzmq":
|
|
return BackendLuxZMQ
|
|
case "czmq":
|
|
return BackendCZMQ
|
|
}
|
|
}
|
|
|
|
// Check build tags
|
|
if strings.Contains(buildTags, "stub") {
|
|
return BackendStub
|
|
}
|
|
if strings.Contains(buildTags, "pebbe") {
|
|
return BackendPebbe
|
|
}
|
|
if strings.Contains(buildTags, "czmq") {
|
|
return BackendCZMQ
|
|
}
|
|
|
|
// Default based on CGO availability
|
|
if os.Getenv("CGO_ENABLED") == "0" {
|
|
return BackendStub // No CGO, use stub
|
|
}
|
|
|
|
// Default to luxfi/zmq if available
|
|
return BackendLuxZMQ
|
|
}
|
|
|
|
// GetBackendInfo returns information about the current backend
|
|
func GetBackendInfo() string {
|
|
backend := DetectBackend()
|
|
|
|
info := fmt.Sprintf("QZMQ Backend: %s\n", backend)
|
|
|
|
switch backend {
|
|
case BackendStub:
|
|
info += " - No external dependencies\n"
|
|
info += " - In-memory message routing\n"
|
|
info += " - Suitable for testing and development\n"
|
|
|
|
case BackendPebbe:
|
|
info += " - Uses pebbe/zmq4 library\n"
|
|
info += " - Requires libzmq and CGO\n"
|
|
info += " - Full ZeroMQ compatibility\n"
|
|
|
|
case BackendLuxZMQ:
|
|
info += " - Custom Lux implementation\n"
|
|
info += " - Optimized for Lux network\n"
|
|
info += " - Integrated quantum security\n"
|
|
|
|
case BackendCZMQ:
|
|
info += " - Advanced CZMQ binding\n"
|
|
info += " - High-performance features\n"
|
|
info += " - Requires CZMQ library\n"
|
|
}
|
|
|
|
// Add quantum security status
|
|
if IsQuantumEnabled() {
|
|
info += "\nQuantum Security: ENABLED\n"
|
|
info += " - ML-KEM-768 key exchange\n"
|
|
info += " - ML-DSA-87 signatures\n"
|
|
info += " - AES-256-GCM encryption\n"
|
|
} else {
|
|
info += "\nQuantum Security: DISABLED\n"
|
|
}
|
|
|
|
return info
|
|
}
|
|
|
|
// IsQuantumEnabled checks if quantum security features are available
|
|
func IsQuantumEnabled() bool {
|
|
// Check if luxfi/crypto is available
|
|
// In production, this would check actual library availability
|
|
return os.Getenv("QZMQ_QUANTUM") != "false"
|
|
}
|
|
|
|
// ValidateBackend checks if the selected backend is properly configured
|
|
func ValidateBackend() error {
|
|
backend := DetectBackend()
|
|
|
|
switch backend {
|
|
case BackendStub:
|
|
// Stub always works
|
|
return nil
|
|
|
|
case BackendPebbe:
|
|
// Check for CGO
|
|
if os.Getenv("CGO_ENABLED") == "0" {
|
|
return fmt.Errorf("pebbe backend requires CGO_ENABLED=1")
|
|
}
|
|
// Would check for libzmq here
|
|
return nil
|
|
|
|
case BackendLuxZMQ:
|
|
// Check for luxfi/zmq availability
|
|
// Would verify the library is properly linked
|
|
return nil
|
|
|
|
case BackendCZMQ:
|
|
// Check for CZMQ
|
|
if os.Getenv("CGO_ENABLED") == "0" {
|
|
return fmt.Errorf("CZMQ backend requires CGO_ENABLED=1")
|
|
}
|
|
return nil
|
|
|
|
default:
|
|
return fmt.Errorf("unknown backend: %s", backend)
|
|
}
|
|
}
|
|
|
|
// BackendCapabilities describes what a backend supports
|
|
type BackendCapabilities struct {
|
|
SupportsQuantum bool
|
|
SupportsMulticast bool
|
|
SupportsEncryption bool
|
|
RequiresCGO bool
|
|
RequiresLibrary string
|
|
MaxThroughput string
|
|
TypicalLatency string
|
|
}
|
|
|
|
// GetBackendCapabilities returns the capabilities of the current backend
|
|
func GetBackendCapabilities() BackendCapabilities {
|
|
backend := DetectBackend()
|
|
|
|
switch backend {
|
|
case BackendStub:
|
|
return BackendCapabilities{
|
|
SupportsQuantum: true, // Simulated
|
|
SupportsMulticast: true, // Simulated
|
|
SupportsEncryption: true, // Simulated
|
|
RequiresCGO: false,
|
|
RequiresLibrary: "none",
|
|
MaxThroughput: "10K msg/sec",
|
|
TypicalLatency: "1ms",
|
|
}
|
|
|
|
case BackendPebbe:
|
|
return BackendCapabilities{
|
|
SupportsQuantum: true,
|
|
SupportsMulticast: true,
|
|
SupportsEncryption: true,
|
|
RequiresCGO: true,
|
|
RequiresLibrary: "libzmq",
|
|
MaxThroughput: "1M msg/sec",
|
|
TypicalLatency: "10μs",
|
|
}
|
|
|
|
case BackendLuxZMQ:
|
|
return BackendCapabilities{
|
|
SupportsQuantum: true,
|
|
SupportsMulticast: true,
|
|
SupportsEncryption: true,
|
|
RequiresCGO: true,
|
|
RequiresLibrary: "luxzmq",
|
|
MaxThroughput: "5M msg/sec",
|
|
TypicalLatency: "1μs",
|
|
}
|
|
|
|
case BackendCZMQ:
|
|
return BackendCapabilities{
|
|
SupportsQuantum: true,
|
|
SupportsMulticast: true,
|
|
SupportsEncryption: true,
|
|
RequiresCGO: true,
|
|
RequiresLibrary: "libczmq",
|
|
MaxThroughput: "10M msg/sec",
|
|
TypicalLatency: "500ns",
|
|
}
|
|
|
|
default:
|
|
return BackendCapabilities{}
|
|
}
|
|
}
|
|
|
|
// SelectBackendForEnvironment chooses the best backend for the runtime environment
|
|
func SelectBackendForEnvironment() BackendType {
|
|
// For production environments, prefer high-performance backends
|
|
if os.Getenv("QZMQ_ENV") == "production" {
|
|
if err := ValidateBackendType(BackendLuxZMQ); err == nil {
|
|
return BackendLuxZMQ
|
|
}
|
|
if err := ValidateBackendType(BackendCZMQ); err == nil {
|
|
return BackendCZMQ
|
|
}
|
|
if err := ValidateBackendType(BackendPebbe); err == nil {
|
|
return BackendPebbe
|
|
}
|
|
}
|
|
|
|
// For development/testing
|
|
if os.Getenv("QZMQ_ENV") == "development" || os.Getenv("QZMQ_ENV") == "test" {
|
|
return BackendStub // Use stub for easy testing
|
|
}
|
|
|
|
// Default selection
|
|
return DetectBackend()
|
|
}
|
|
|
|
// ValidateBackendType checks if a specific backend can be used
|
|
func ValidateBackendType(backend BackendType) error {
|
|
switch backend {
|
|
case BackendStub:
|
|
return nil
|
|
|
|
case BackendPebbe:
|
|
if os.Getenv("CGO_ENABLED") == "0" {
|
|
return fmt.Errorf("backend %s requires CGO", backend)
|
|
}
|
|
return nil
|
|
|
|
case BackendLuxZMQ:
|
|
if os.Getenv("CGO_ENABLED") == "0" {
|
|
return fmt.Errorf("backend %s requires CGO", backend)
|
|
}
|
|
// Would check for luxfi/zmq
|
|
return nil
|
|
|
|
case BackendCZMQ:
|
|
if os.Getenv("CGO_ENABLED") == "0" {
|
|
return fmt.Errorf("backend %s requires CGO", backend)
|
|
}
|
|
// Would check for CZMQ
|
|
return nil
|
|
|
|
default:
|
|
return fmt.Errorf("unknown backend: %s", backend)
|
|
}
|
|
}
|