mirror of
https://github.com/anyproto/any-sync.git
synced 2025-06-10 18:10:54 +09:00
114 lines
2.8 KiB
Go
114 lines
2.8 KiB
Go
package node
|
|
|
|
import (
|
|
"context"
|
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/app"
|
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/app/logger"
|
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/config"
|
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys"
|
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys/asymmetric/encryptionkey"
|
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys/asymmetric/signingkey"
|
|
"go.uber.org/zap"
|
|
)
|
|
|
|
const CName = "NodesService"
|
|
|
|
var log = logger.NewNamed("nodesservice")
|
|
|
|
type Node struct {
|
|
Address string
|
|
PeerId string
|
|
SigningKey signingkey.PubKey
|
|
EncryptionKey encryptionkey.PubKey
|
|
SigningKeyString string
|
|
EncryptionKeyString string
|
|
}
|
|
|
|
func (n *Node) Id() string {
|
|
return n.PeerId
|
|
}
|
|
|
|
func (n *Node) Capacity() float64 {
|
|
return 1
|
|
}
|
|
|
|
func New() app.Component {
|
|
return &service{}
|
|
}
|
|
|
|
type Service interface {
|
|
Nodes() []*Node
|
|
}
|
|
|
|
type service struct {
|
|
nodes []*Node
|
|
}
|
|
|
|
func (s *service) Init(ctx context.Context, a *app.App) (err error) {
|
|
cfg := a.MustComponent(config.CName).(*config.Config)
|
|
signDecoder := signingkey.NewEDPrivKeyDecoder()
|
|
rsaDecoder := encryptionkey.NewRSAPrivKeyDecoder()
|
|
|
|
var filteredNodes []*Node
|
|
for _, n := range cfg.Nodes {
|
|
if n.PeerId == cfg.Account.PeerId {
|
|
continue
|
|
}
|
|
node, err := nodeFromConfigNode(n, n.PeerId, signDecoder, rsaDecoder)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
log.With(zap.String("node", node.PeerId)).Debug("adding peer to known nodes")
|
|
filteredNodes = append(filteredNodes, node)
|
|
}
|
|
s.nodes = filteredNodes
|
|
return nil
|
|
}
|
|
|
|
func (s *service) Name() (name string) {
|
|
return CName
|
|
}
|
|
|
|
func (s *service) Run(ctx context.Context) (err error) {
|
|
return nil
|
|
}
|
|
|
|
func (s *service) Close(ctx context.Context) (err error) {
|
|
return nil
|
|
}
|
|
|
|
func (s *service) Nodes() []*Node {
|
|
return s.nodes
|
|
}
|
|
|
|
func nodeFromConfigNode(
|
|
n config.Node,
|
|
peerId string,
|
|
privateSigningDecoder keys.Decoder,
|
|
privateEncryptionDecoder keys.Decoder) (*Node, error) {
|
|
decodedSigningKey, err := privateSigningDecoder.DecodeFromString(n.SigningKey)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
decodedEncryptionKey, err := privateEncryptionDecoder.DecodeFromString(n.EncryptionKey)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
encKeyString, err := privateEncryptionDecoder.EncodeToString(decodedEncryptionKey.(encryptionkey.PrivKey).GetPublic())
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
signKeyString, err := privateSigningDecoder.EncodeToString(decodedSigningKey.(signingkey.PrivKey).GetPublic())
|
|
|
|
return &Node{
|
|
Address: n.Address,
|
|
PeerId: peerId,
|
|
SigningKey: decodedSigningKey.(signingkey.PrivKey).GetPublic(),
|
|
EncryptionKey: decodedEncryptionKey.(encryptionkey.PrivKey).GetPublic(),
|
|
SigningKeyString: signKeyString,
|
|
EncryptionKeyString: encKeyString,
|
|
}, nil
|
|
}
|