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>
304 lines
11 KiB
Go
304 lines
11 KiB
Go
package storage
|
|
|
|
import (
|
|
"context"
|
|
"time"
|
|
|
|
"chorus/pkg/ucxl"
|
|
"chorus/pkg/crypto"
|
|
slurpContext "chorus/pkg/slurp/context"
|
|
)
|
|
|
|
// ContextStore provides the main interface for context storage and retrieval
|
|
//
|
|
// This is the primary interface for storing, retrieving, and managing context
|
|
// data with support for both local and distributed storage, role-based access
|
|
// control, and efficient search capabilities.
|
|
type ContextStore interface {
|
|
// StoreContext stores a context node with role-based encryption
|
|
StoreContext(ctx context.Context, node *slurpContext.ContextNode, roles []string) error
|
|
|
|
// RetrieveContext retrieves context for a UCXL address and role
|
|
RetrieveContext(ctx context.Context, address ucxl.Address, role string) (*slurpContext.ContextNode, error)
|
|
|
|
// UpdateContext updates an existing context node
|
|
UpdateContext(ctx context.Context, node *slurpContext.ContextNode, roles []string) error
|
|
|
|
// DeleteContext removes a context node from storage
|
|
DeleteContext(ctx context.Context, address ucxl.Address) error
|
|
|
|
// ExistsContext checks if context exists for an address
|
|
ExistsContext(ctx context.Context, address ucxl.Address) (bool, error)
|
|
|
|
// ListContexts lists contexts matching criteria
|
|
ListContexts(ctx context.Context, criteria *ListCriteria) ([]*slurpContext.ContextNode, error)
|
|
|
|
// SearchContexts searches contexts using query criteria
|
|
SearchContexts(ctx context.Context, query *SearchQuery) (*SearchResults, error)
|
|
|
|
// BatchStore stores multiple contexts efficiently
|
|
BatchStore(ctx context.Context, batch *BatchStoreRequest) (*BatchStoreResult, error)
|
|
|
|
// BatchRetrieve retrieves multiple contexts efficiently
|
|
BatchRetrieve(ctx context.Context, batch *BatchRetrieveRequest) (*BatchRetrieveResult, error)
|
|
|
|
// GetStorageStats returns storage statistics and health information
|
|
GetStorageStats(ctx context.Context) (*StorageStatistics, error)
|
|
|
|
// Sync synchronizes with distributed storage
|
|
Sync(ctx context.Context) error
|
|
|
|
// Backup creates a backup of stored contexts
|
|
Backup(ctx context.Context, destination string) error
|
|
|
|
// Restore restores contexts from backup
|
|
Restore(ctx context.Context, source string) error
|
|
}
|
|
|
|
// LocalStorage provides local filesystem-based storage
|
|
type LocalStorage interface {
|
|
// Store stores context data locally with optional encryption
|
|
Store(ctx context.Context, key string, data interface{}, options *StoreOptions) error
|
|
|
|
// Retrieve retrieves context data from local storage
|
|
Retrieve(ctx context.Context, key string) (interface{}, error)
|
|
|
|
// Delete removes data from local storage
|
|
Delete(ctx context.Context, key string) error
|
|
|
|
// Exists checks if data exists locally
|
|
Exists(ctx context.Context, key string) (bool, error)
|
|
|
|
// List lists all keys matching a pattern
|
|
List(ctx context.Context, pattern string) ([]string, error)
|
|
|
|
// Size returns the size of stored data
|
|
Size(ctx context.Context, key string) (int64, error)
|
|
|
|
// Compact compacts local storage to reclaim space
|
|
Compact(ctx context.Context) error
|
|
|
|
// GetLocalStats returns local storage statistics
|
|
GetLocalStats() (*LocalStorageStats, error)
|
|
}
|
|
|
|
// DistributedStorage provides DHT-based distributed storage
|
|
type DistributedStorage interface {
|
|
// Store stores data in the distributed DHT with replication
|
|
Store(ctx context.Context, key string, data interface{}, options *DistributedStoreOptions) error
|
|
|
|
// Retrieve retrieves data from the distributed DHT
|
|
Retrieve(ctx context.Context, key string) (interface{}, error)
|
|
|
|
// Delete removes data from the distributed DHT
|
|
Delete(ctx context.Context, key string) error
|
|
|
|
// Exists checks if data exists in the DHT
|
|
Exists(ctx context.Context, key string) (bool, error)
|
|
|
|
// Replicate ensures data is replicated across nodes
|
|
Replicate(ctx context.Context, key string, replicationFactor int) error
|
|
|
|
// FindReplicas finds all replicas of data
|
|
FindReplicas(ctx context.Context, key string) ([]string, error)
|
|
|
|
// Sync synchronizes with other DHT nodes
|
|
Sync(ctx context.Context) error
|
|
|
|
// GetDistributedStats returns distributed storage statistics
|
|
GetDistributedStats() (*DistributedStorageStats, error)
|
|
}
|
|
|
|
// EncryptedStorage provides role-based encrypted storage
|
|
type EncryptedStorage interface {
|
|
// StoreEncrypted stores data encrypted for specific roles
|
|
StoreEncrypted(ctx context.Context, key string, data interface{}, roles []string) error
|
|
|
|
// RetrieveDecrypted retrieves and decrypts data for current role
|
|
RetrieveDecrypted(ctx context.Context, key string, role string) (interface{}, error)
|
|
|
|
// CanAccess checks if a role can access specific data
|
|
CanAccess(ctx context.Context, key string, role string) (bool, error)
|
|
|
|
// ListAccessibleKeys lists keys accessible to a role
|
|
ListAccessibleKeys(ctx context.Context, role string) ([]string, error)
|
|
|
|
// ReEncryptForRoles re-encrypts data for different roles
|
|
ReEncryptForRoles(ctx context.Context, key string, newRoles []string) error
|
|
|
|
// GetAccessRoles gets roles that can access specific data
|
|
GetAccessRoles(ctx context.Context, key string) ([]string, error)
|
|
|
|
// RotateKeys rotates encryption keys
|
|
RotateKeys(ctx context.Context, maxAge time.Duration) error
|
|
|
|
// ValidateEncryption validates encryption integrity
|
|
ValidateEncryption(ctx context.Context, key string) error
|
|
}
|
|
|
|
// CacheManager manages multi-level caching for performance
|
|
type CacheManager interface {
|
|
// Get retrieves data from cache
|
|
Get(ctx context.Context, key string) (interface{}, bool, error)
|
|
|
|
// Set stores data in cache with TTL
|
|
Set(ctx context.Context, key string, data interface{}, ttl time.Duration) error
|
|
|
|
// Delete removes data from cache
|
|
Delete(ctx context.Context, key string) error
|
|
|
|
// DeletePattern removes cache entries matching pattern
|
|
DeletePattern(ctx context.Context, pattern string) error
|
|
|
|
// Clear clears all cache entries
|
|
Clear(ctx context.Context) error
|
|
|
|
// Warm pre-loads cache with frequently accessed data
|
|
Warm(ctx context.Context, keys []string) error
|
|
|
|
// GetCacheStats returns cache performance statistics
|
|
GetCacheStats() (*CacheStatistics, error)
|
|
|
|
// SetCachePolicy sets caching policy
|
|
SetCachePolicy(policy *CachePolicy) error
|
|
}
|
|
|
|
// IndexManager manages search indexes for efficient querying
|
|
type IndexManager interface {
|
|
// CreateIndex creates a search index for contexts
|
|
CreateIndex(ctx context.Context, indexName string, config *IndexConfig) error
|
|
|
|
// UpdateIndex updates search index with new data
|
|
UpdateIndex(ctx context.Context, indexName string, key string, data interface{}) error
|
|
|
|
// DeleteFromIndex removes data from search index
|
|
DeleteFromIndex(ctx context.Context, indexName string, key string) error
|
|
|
|
// Search searches indexed data using query
|
|
Search(ctx context.Context, indexName string, query *SearchQuery) (*SearchResults, error)
|
|
|
|
// RebuildIndex rebuilds search index from stored data
|
|
RebuildIndex(ctx context.Context, indexName string) error
|
|
|
|
// OptimizeIndex optimizes search index for performance
|
|
OptimizeIndex(ctx context.Context, indexName string) error
|
|
|
|
// GetIndexStats returns index statistics
|
|
GetIndexStats(ctx context.Context, indexName string) (*IndexStatistics, error)
|
|
|
|
// ListIndexes lists all available indexes
|
|
ListIndexes(ctx context.Context) ([]string, error)
|
|
}
|
|
|
|
// BackupManager handles backup and recovery operations
|
|
type BackupManager interface {
|
|
// CreateBackup creates a backup of stored data
|
|
CreateBackup(ctx context.Context, config *BackupConfig) (*BackupInfo, error)
|
|
|
|
// RestoreBackup restores data from backup
|
|
RestoreBackup(ctx context.Context, backupID string, config *RestoreConfig) error
|
|
|
|
// ListBackups lists available backups
|
|
ListBackups(ctx context.Context) ([]*BackupInfo, error)
|
|
|
|
// DeleteBackup removes a backup
|
|
DeleteBackup(ctx context.Context, backupID string) error
|
|
|
|
// ValidateBackup validates backup integrity
|
|
ValidateBackup(ctx context.Context, backupID string) (*BackupValidation, error)
|
|
|
|
// ScheduleBackup schedules automatic backups
|
|
ScheduleBackup(ctx context.Context, schedule *BackupSchedule) error
|
|
|
|
// GetBackupStats returns backup statistics
|
|
GetBackupStats(ctx context.Context) (*BackupStatistics, error)
|
|
}
|
|
|
|
// TransactionManager provides ACID transaction support
|
|
type TransactionManager interface {
|
|
// BeginTransaction starts a new transaction
|
|
BeginTransaction(ctx context.Context) (*Transaction, error)
|
|
|
|
// CommitTransaction commits a transaction
|
|
CommitTransaction(ctx context.Context, tx *Transaction) error
|
|
|
|
// RollbackTransaction rolls back a transaction
|
|
RollbackTransaction(ctx context.Context, tx *Transaction) error
|
|
|
|
// GetActiveTransactions returns list of active transactions
|
|
GetActiveTransactions(ctx context.Context) ([]*Transaction, error)
|
|
}
|
|
|
|
// EventNotifier provides event notifications for storage operations
|
|
type EventNotifier interface {
|
|
// NotifyStored notifies when data is stored
|
|
NotifyStored(ctx context.Context, event *StorageEvent) error
|
|
|
|
// NotifyRetrieved notifies when data is retrieved
|
|
NotifyRetrieved(ctx context.Context, event *StorageEvent) error
|
|
|
|
// NotifyUpdated notifies when data is updated
|
|
NotifyUpdated(ctx context.Context, event *StorageEvent) error
|
|
|
|
// NotifyDeleted notifies when data is deleted
|
|
NotifyDeleted(ctx context.Context, event *StorageEvent) error
|
|
|
|
// Subscribe subscribes to storage events
|
|
Subscribe(ctx context.Context, eventType EventType, handler EventHandler) error
|
|
|
|
// Unsubscribe unsubscribes from storage events
|
|
Unsubscribe(ctx context.Context, eventType EventType, handler EventHandler) error
|
|
}
|
|
|
|
// Supporting types for storage operations
|
|
|
|
// EventType represents types of storage events
|
|
type EventType string
|
|
|
|
const (
|
|
EventStored EventType = "stored"
|
|
EventRetrieved EventType = "retrieved"
|
|
EventUpdated EventType = "updated"
|
|
EventDeleted EventType = "deleted"
|
|
EventSynced EventType = "synced"
|
|
EventBackedUp EventType = "backed_up"
|
|
EventRestored EventType = "restored"
|
|
)
|
|
|
|
// EventHandler handles storage events
|
|
type EventHandler func(event *StorageEvent) error
|
|
|
|
// StorageEvent represents a storage operation event
|
|
type StorageEvent struct {
|
|
Type EventType `json:"type"` // Event type
|
|
Key string `json:"key"` // Storage key
|
|
Data interface{} `json:"data"` // Event data
|
|
Timestamp time.Time `json:"timestamp"` // When event occurred
|
|
Metadata map[string]interface{} `json:"metadata"` // Additional metadata
|
|
}
|
|
|
|
// Transaction represents a storage transaction
|
|
type Transaction struct {
|
|
ID string `json:"id"` // Transaction ID
|
|
StartTime time.Time `json:"start_time"` // When transaction started
|
|
Operations []*TransactionOperation `json:"operations"` // Transaction operations
|
|
Status TransactionStatus `json:"status"` // Transaction status
|
|
}
|
|
|
|
// TransactionOperation represents a single operation in a transaction
|
|
type TransactionOperation struct {
|
|
Type string `json:"type"` // Operation type
|
|
Key string `json:"key"` // Storage key
|
|
Data interface{} `json:"data"` // Operation data
|
|
Metadata map[string]interface{} `json:"metadata"` // Operation metadata
|
|
}
|
|
|
|
// TransactionStatus represents transaction status
|
|
type TransactionStatus string
|
|
|
|
const (
|
|
TransactionActive TransactionStatus = "active"
|
|
TransactionCommitted TransactionStatus = "committed"
|
|
TransactionRolledBack TransactionStatus = "rolled_back"
|
|
TransactionFailed TransactionStatus = "failed"
|
|
) |