mirror of
https://github.com/bitechdev/ResolveSpec.git
synced 2025-12-13 17:10:36 +00:00
161 lines
4.0 KiB
Go
161 lines
4.0 KiB
Go
package eventbroker
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"sync"
|
|
|
|
"github.com/bitechdev/ResolveSpec/pkg/config"
|
|
"github.com/bitechdev/ResolveSpec/pkg/logger"
|
|
"github.com/bitechdev/ResolveSpec/pkg/server"
|
|
)
|
|
|
|
var (
|
|
defaultBroker Broker
|
|
brokerMu sync.RWMutex
|
|
)
|
|
|
|
// Initialize initializes the global event broker from configuration
|
|
func Initialize(cfg config.EventBrokerConfig) error {
|
|
if !cfg.Enabled {
|
|
logger.Info("Event broker is disabled")
|
|
return nil
|
|
}
|
|
|
|
// Create provider
|
|
provider, err := NewProviderFromConfig(cfg)
|
|
if err != nil {
|
|
return fmt.Errorf("failed to create provider: %w", err)
|
|
}
|
|
|
|
// Parse mode
|
|
mode := ProcessingModeAsync
|
|
if cfg.Mode == "sync" {
|
|
mode = ProcessingModeSync
|
|
}
|
|
|
|
// Convert retry policy
|
|
retryPolicy := &RetryPolicy{
|
|
MaxRetries: cfg.RetryPolicy.MaxRetries,
|
|
InitialDelay: cfg.RetryPolicy.InitialDelay,
|
|
MaxDelay: cfg.RetryPolicy.MaxDelay,
|
|
BackoffFactor: cfg.RetryPolicy.BackoffFactor,
|
|
}
|
|
if retryPolicy.MaxRetries == 0 {
|
|
retryPolicy = DefaultRetryPolicy()
|
|
}
|
|
|
|
// Create broker options
|
|
opts := Options{
|
|
Provider: provider,
|
|
Mode: mode,
|
|
WorkerCount: cfg.WorkerCount,
|
|
BufferSize: cfg.BufferSize,
|
|
RetryPolicy: retryPolicy,
|
|
InstanceID: getInstanceID(cfg.InstanceID),
|
|
}
|
|
|
|
// Create broker
|
|
broker, err := NewBroker(opts)
|
|
if err != nil {
|
|
return fmt.Errorf("failed to create broker: %w", err)
|
|
}
|
|
|
|
// Start broker
|
|
if err := broker.Start(context.Background()); err != nil {
|
|
return fmt.Errorf("failed to start broker: %w", err)
|
|
}
|
|
|
|
// Set as default
|
|
SetDefaultBroker(broker)
|
|
|
|
// Register shutdown callback
|
|
RegisterShutdown(broker)
|
|
|
|
logger.Info("Event broker initialized successfully (provider: %s, mode: %s, instance: %s)",
|
|
cfg.Provider, cfg.Mode, opts.InstanceID)
|
|
|
|
return nil
|
|
}
|
|
|
|
// SetDefaultBroker sets the default global broker
|
|
func SetDefaultBroker(broker Broker) {
|
|
brokerMu.Lock()
|
|
defer brokerMu.Unlock()
|
|
defaultBroker = broker
|
|
}
|
|
|
|
// GetDefaultBroker returns the default global broker
|
|
func GetDefaultBroker() Broker {
|
|
brokerMu.RLock()
|
|
defer brokerMu.RUnlock()
|
|
return defaultBroker
|
|
}
|
|
|
|
// IsInitialized returns true if the default broker is initialized
|
|
func IsInitialized() bool {
|
|
return GetDefaultBroker() != nil
|
|
}
|
|
|
|
// Publish publishes an event using the default broker
|
|
func Publish(ctx context.Context, event *Event) error {
|
|
broker := GetDefaultBroker()
|
|
if broker == nil {
|
|
return fmt.Errorf("event broker not initialized")
|
|
}
|
|
return broker.Publish(ctx, event)
|
|
}
|
|
|
|
// PublishSync publishes an event synchronously using the default broker
|
|
func PublishSync(ctx context.Context, event *Event) error {
|
|
broker := GetDefaultBroker()
|
|
if broker == nil {
|
|
return fmt.Errorf("event broker not initialized")
|
|
}
|
|
return broker.PublishSync(ctx, event)
|
|
}
|
|
|
|
// PublishAsync publishes an event asynchronously using the default broker
|
|
func PublishAsync(ctx context.Context, event *Event) error {
|
|
broker := GetDefaultBroker()
|
|
if broker == nil {
|
|
return fmt.Errorf("event broker not initialized")
|
|
}
|
|
return broker.PublishAsync(ctx, event)
|
|
}
|
|
|
|
// Subscribe subscribes to events using the default broker
|
|
func Subscribe(pattern string, handler EventHandler) (SubscriptionID, error) {
|
|
broker := GetDefaultBroker()
|
|
if broker == nil {
|
|
return "", fmt.Errorf("event broker not initialized")
|
|
}
|
|
return broker.Subscribe(pattern, handler)
|
|
}
|
|
|
|
// Unsubscribe unsubscribes from events using the default broker
|
|
func Unsubscribe(id SubscriptionID) error {
|
|
broker := GetDefaultBroker()
|
|
if broker == nil {
|
|
return fmt.Errorf("event broker not initialized")
|
|
}
|
|
return broker.Unsubscribe(id)
|
|
}
|
|
|
|
// Stats returns statistics from the default broker
|
|
func Stats(ctx context.Context) (*BrokerStats, error) {
|
|
broker := GetDefaultBroker()
|
|
if broker == nil {
|
|
return nil, fmt.Errorf("event broker not initialized")
|
|
}
|
|
return broker.Stats(ctx)
|
|
}
|
|
|
|
// RegisterShutdown registers the broker's shutdown with the server shutdown callbacks
|
|
func RegisterShutdown(broker Broker) {
|
|
server.RegisterShutdownCallback(func(ctx context.Context) error {
|
|
logger.Info("Shutting down event broker...")
|
|
return broker.Stop(ctx)
|
|
})
|
|
}
|