mirror of
https://github.com/DeBrosOfficial/orama.git
synced 2026-03-17 13:56:57 +00:00
48 lines
1.2 KiB
Go
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))
|
|
}
|