orama/pkg/pubsub/manager.go
2026-02-13 14:33:11 +02:00

48 lines
1.2 KiB
Go

package pubsub
import (
"crypto/rand"
"encoding/hex"
"sync"
pubsub "github.com/libp2p/go-libp2p-pubsub"
"go.uber.org/zap"
)
// Manager handles pub/sub operations
type Manager struct {
pubsub *pubsub.PubSub
topics map[string]*pubsub.Topic
subscriptions map[string]*topicSubscription
namespace string
logger *zap.Logger
mu sync.RWMutex
}
// topicSubscription holds multiple handlers for a single topic
type topicSubscription struct {
sub *pubsub.Subscription
cancel func()
handlers map[HandlerID]MessageHandler
refCount int // Number of active subscriptions
mu sync.RWMutex
}
// NewManager creates a new pubsub manager
func NewManager(ps *pubsub.PubSub, namespace string, logger *zap.Logger) *Manager {
return &Manager{
pubsub: ps,
topics: make(map[string]*pubsub.Topic),
subscriptions: make(map[string]*topicSubscription),
namespace: namespace,
logger: logger.Named("pubsub"),
}
}
// generateHandlerID creates a unique handler ID
func generateHandlerID() HandlerID {
b := make([]byte, 8)
rand.Read(b)
return HandlerID(hex.EncodeToString(b))
}