Files
oc-discovery/daemons/node/indexer/service.go

77 lines
2.4 KiB
Go
Raw Normal View History

2026-01-30 16:57:36 +01:00
package indexer
import (
"context"
"oc-discovery/daemons/node/common"
2026-02-04 11:35:19 +01:00
"sync"
2026-01-30 16:57:36 +01:00
2026-02-02 09:05:58 +01:00
oclib "cloud.o-forge.io/core/oc-lib"
dht "github.com/libp2p/go-libp2p-kad-dht"
2026-01-30 16:57:36 +01:00
pubsub "github.com/libp2p/go-libp2p-pubsub"
record "github.com/libp2p/go-libp2p-record"
2026-01-30 16:57:36 +01:00
"github.com/libp2p/go-libp2p/core/host"
2026-02-04 11:35:19 +01:00
"github.com/libp2p/go-libp2p/core/peer"
2026-01-30 16:57:36 +01:00
)
// Index Record is the model for the specialized registry of node connected to Indexer
type IndexerService struct {
*common.LongLivedStreamRecordedService[PeerRecord]
PS *pubsub.PubSub
DHT *dht.IpfsDHT
2026-01-30 16:57:36 +01:00
isStrictIndexer bool
2026-02-04 11:35:19 +01:00
mu sync.RWMutex
DisposedPeers map[peer.ID]*common.TopicNodeActivityPub
SeenQueries map[string]bool
SeenMU sync.Mutex
2026-01-30 16:57:36 +01:00
}
// if a pubsub is given... indexer is also an active oc-node. If not... your a strict indexer
func NewIndexerService(h host.Host, ps *pubsub.PubSub, maxNode int) *IndexerService {
2026-02-02 09:05:58 +01:00
logger := oclib.GetLogger()
logger.Info().Msg("open indexer mode...")
2026-01-30 16:57:36 +01:00
var err error
ix := &IndexerService{
LongLivedStreamRecordedService: common.NewStreamRecordedService[PeerRecord](h, maxNode, false),
isStrictIndexer: ps == nil,
}
if ps == nil { // generate your fresh gossip for the flow of killed node... EVERYBODY should know !
ps, err = pubsub.NewGossipSub(context.Background(), ix.Host)
if err != nil {
panic(err) // can't run your indexer without a propalgation pubsub, of state of node.
}
}
ix.PS = ps
// later TODO : all indexer laucnh a private replica of them self. DEV OPS
if ix.isStrictIndexer {
2026-02-02 09:05:58 +01:00
logger.Info().Msg("connect to indexers as strict indexer...")
2026-01-30 16:57:36 +01:00
common.ConnectToIndexers(h, 0, 5, ix.Host.ID()) // TODO : make var to change how many indexers are allowed.
2026-02-02 09:05:58 +01:00
logger.Info().Msg("subscribe to node activity as strict indexer...")
2026-02-04 11:35:19 +01:00
2026-02-02 09:05:58 +01:00
logger.Info().Msg("subscribe to decentralized search flow as strict indexer...")
2026-02-04 11:35:19 +01:00
ix.SubscribeToSearch(ix.PS, nil)
}
if ix.DHT, err = dht.New(
context.Background(),
ix.Host,
dht.Mode(dht.ModeServer),
dht.Validator(record.NamespacedValidator{
"node": PeerRecordValidator{},
}),
); err != nil {
return nil
2026-01-30 16:57:36 +01:00
}
ix.initNodeHandler() // then listen up on every protocol expected
2026-01-30 16:57:36 +01:00
return ix
}
func (ix *IndexerService) Close() {
ix.DHT.Close()
ix.PS.UnregisterTopicValidator(common.TopicPubSubSearch)
2026-01-30 16:57:36 +01:00
for _, s := range ix.StreamRecords {
for _, ss := range s {
ss.HeartbeatStream.Stream.Close()
}
}
}