59 lines
1.1 KiB
Go
59 lines
1.1 KiB
Go
package dht
|
|
|
|
import (
|
|
"net"
|
|
"time"
|
|
|
|
"go.uber.org/zap"
|
|
|
|
"github.com/boramalper/magnetico/cmd/magneticod/dht/mainline"
|
|
)
|
|
|
|
type Service interface {
|
|
Start()
|
|
Terminate()
|
|
}
|
|
|
|
type Result interface {
|
|
InfoHash() [20]byte
|
|
PeerAddrs() []net.TCPAddr
|
|
}
|
|
|
|
type Manager struct {
|
|
output chan Result
|
|
indexingServices []Service
|
|
}
|
|
|
|
func NewManager(addrs []string, interval time.Duration, maxNeighbors uint) *Manager {
|
|
manager := new(Manager)
|
|
manager.output = make(chan Result, 20)
|
|
|
|
for _, addr := range addrs {
|
|
service := mainline.NewIndexingService(addr, interval, maxNeighbors, mainline.IndexingServiceEventHandlers{
|
|
OnResult: manager.onIndexingResult,
|
|
})
|
|
manager.indexingServices = append(manager.indexingServices, service)
|
|
service.Start()
|
|
}
|
|
|
|
return manager
|
|
}
|
|
|
|
func (m *Manager) onIndexingResult(res mainline.IndexingResult) {
|
|
select {
|
|
case m.output <- res:
|
|
default:
|
|
zap.L().Debug("DHT manager output ch is full, idx result dropped!")
|
|
}
|
|
}
|
|
|
|
func (m *Manager) Output() <-chan Result {
|
|
return m.output
|
|
}
|
|
|
|
func (m *Manager) Terminate() {
|
|
for _, service := range m.indexingServices {
|
|
service.Terminate()
|
|
}
|
|
}
|