Partnerships evolution

This commit is contained in:
mr
2026-01-26 15:45:13 +01:00
parent 07ec659bb4
commit 5a94504abb
4 changed files with 69 additions and 30 deletions

View File

@@ -8,6 +8,7 @@ import (
"fmt"
"oc-peer/conf"
"slices"
"sync"
"time"
oclib "cloud.o-forge.io/core/oc-lib"
@@ -39,6 +40,7 @@ type DHTService struct {
Host host.Host
DHT *dht.IpfsDHT
Cache []string
mutex sync.RWMutex
}
var singletonService *DHTService
@@ -93,7 +95,9 @@ func (d *DHTService) RefreshKeys(ctx context.Context, interval time.Duration) {
return
case <-ticker.C:
s := []string{}
d.mutex.Lock()
s = append(s, d.Cache...)
d.mutex.Unlock()
for _, key := range s {
_, _ = d.GetValue(ctx, key)
}
@@ -111,9 +115,11 @@ func (d *DHTService) PutValue(
if err != nil {
return err
}
d.mutex.Lock()
if !slices.Contains(d.Cache, key) {
d.Cache = append(d.Cache, key)
}
d.mutex.Unlock()
return nil
}
@@ -124,22 +130,27 @@ func (d *DHTService) GetValue(
dht, err := d.DHT.GetValue(ctx, key)
if err != nil {
cache := []string{}
d.mutex.Lock()
for _, c := range d.Cache {
if c != key {
cache = append(cache, c)
}
}
d.Cache = cache
d.mutex.Unlock()
return nil, err
}
d.mutex.Lock()
if !slices.Contains(d.Cache, key) {
d.Cache = append(d.Cache, key)
}
var data *DHTRecord
json.Unmarshal(dht, data)
d.mutex.Unlock()
var data DHTRecord
json.Unmarshal(dht, &data)
if data == nil {
return nil, errors.New("no record found")
peerID, err := oclib.GenerateNodeID()
if err != nil {
return nil, err
}
access := pp.NewAccessor(&tools.APIRequest{Admin: true})
@@ -150,7 +161,7 @@ func (d *DHTService) GetValue(
},
State: pp.ONLINE,
Relation: pp.SELF,
PeerID: d.Host.ID().String(),
PeerID: peerID,
PublicKey: string(data.PubKey),
Url: data.URL,
NATSUrl: oclib.GetConfig().NATSUrl,
@@ -168,14 +179,15 @@ func (d *DHTService) GetValue(
access.UpdateOne(f, f.GetID())
}
return data, err
return &data, err
}
func (d *DHTService) generateKey(
sub string,
name string,
) string {
return "/opencloud/" + sub + "/" + name
func (d *DHTService) generateKey() (string, error) {
s, err := oclib.GenerateNodeID()
if err != nil {
return s, err
}
return "/opencloud/peer/" + s, nil
}
// Create your peer.
@@ -188,14 +200,20 @@ func (d *DHTService) ClaimName(
return nil, errors.New("no endpoint found for peer" + name)
}
peerID, err := oclib.GenerateNodeID()
if err != nil {
return nil, err
}
pub := d.Host.Peerstore().PubKey(d.Host.ID())
pubBytes, _ := pub.Raw()
now := time.Now()
expiry := now.Add(1 * time.Hour)
rec := DHTRecord{
Name: name,
PeerID: d.Host.ID().String(),
PeerID: peerID,
PubKey: pubBytes,
}
@@ -210,12 +228,15 @@ func (d *DHTService) ClaimName(
data, _ := json.Marshal(rec)
key := d.generateKey("peer", rec.Name)
key, err := d.generateKey()
if err != nil {
return nil, err
}
// retrieve your key name in standard
old, err := d.GetValue(ctx, key)
if err == nil {
if old.PeerID != d.Host.ID().String() { // check if someone claims your name before
if old.PeerID != peerID { // check if someone claims your name before
return nil, errors.New("name already claimed by another peer")
// TODO : can be fragile if 2 peers connect at the same time
}
@@ -232,6 +253,9 @@ func (d *DHTService) ClaimName(
pubStr := base64.StdEncoding.EncodeToString(pubBytes)
d.Key = key
access := pp.NewAccessor(&tools.APIRequest{Admin: true})
if err != nil {
return nil, err
}
p := &pp.Peer{
AbstractObject: utils.AbstractObject{
UUID: uuid.New().String(),
@@ -239,7 +263,7 @@ func (d *DHTService) ClaimName(
},
State: pp.ONLINE,
Relation: pp.SELF,
PeerID: d.Host.ID().String(),
PeerID: peerID,
PublicKey: pubStr,
Url: endPoint,
NATSUrl: oclib.GetConfig().NATSUrl,
@@ -248,8 +272,12 @@ func (d *DHTService) ClaimName(
if founded, _, err := access.Search(nil, fmt.Sprintf("%v", pp.SELF.EnumIndex()), false); err != nil || len(founded) == 0 {
access.StoreOne(p)
} else if f, _, err := access.LoadOne(founded[0].GetID()); err == nil {
peerID, err := oclib.GenerateNodeID()
if err != nil {
return nil, err
}
f.(*pp.Peer).Name = name
f.(*pp.Peer).PeerID = d.Host.ID().String()
f.(*pp.Peer).PeerID = peerID
f.(*pp.Peer).State = pp.ONLINE
f.(*pp.Peer).Url = endPoint
f.(*pp.Peer).NATSUrl = oclib.GetConfig().NATSUrl
@@ -340,7 +368,10 @@ func (d *DHTService) DiscoverPeers(
name string,
) ([]*pp.Peer, error) {
peers := []*pp.Peer{}
key := d.generateKey("peer", name)
key, err := d.generateKey()
if err != nil {
return nil, err
}
datas, err := d.DHT.SearchValue(ctx, key)
if err != nil {
return nil, errors.New("no DHT peer not found")
@@ -359,7 +390,10 @@ func (d *DHTService) GetPeer(
ctx context.Context,
name string,
) (*pp.Peer, error) {
key := d.generateKey("peer", name)
key, err := d.generateKey()
if err != nil {
return nil, err
}
data, err := d.GetValue(ctx, key)
if err != nil {
return nil, errors.New("no DHT peer not found")
@@ -393,7 +427,3 @@ func (d *DHTService) existsDHT(ctx context.Context) (*DHTRecord, error) {
}
return rec, nil
}
/*
Apply Name interlude...
*/