2026-01-30 16:57:36 +01:00
|
|
|
package stream
|
|
|
|
|
|
|
|
|
|
import (
|
|
|
|
|
"context"
|
|
|
|
|
"encoding/json"
|
|
|
|
|
"errors"
|
|
|
|
|
"fmt"
|
|
|
|
|
"oc-discovery/daemons/node/common"
|
|
|
|
|
|
|
|
|
|
oclib "cloud.o-forge.io/core/oc-lib"
|
2026-02-02 12:14:01 +01:00
|
|
|
"cloud.o-forge.io/core/oc-lib/dbs"
|
2026-01-30 16:57:36 +01:00
|
|
|
"cloud.o-forge.io/core/oc-lib/models/peer"
|
|
|
|
|
"cloud.o-forge.io/core/oc-lib/tools"
|
|
|
|
|
pp "github.com/libp2p/go-libp2p/core/peer"
|
|
|
|
|
"github.com/libp2p/go-libp2p/core/protocol"
|
|
|
|
|
)
|
|
|
|
|
|
2026-03-03 16:38:24 +01:00
|
|
|
func (ps *StreamService) PublishesCommon(dt *tools.DataType, user string, filter *dbs.Filters, resource []byte, protos ...protocol.ID) error {
|
2026-02-09 13:28:00 +01:00
|
|
|
access := oclib.NewRequestAdmin(oclib.LibDataEnum(oclib.PEER), nil)
|
2026-03-03 16:38:24 +01:00
|
|
|
p := access.Search(filter, "", false)
|
|
|
|
|
for _, pes := range p.Data {
|
|
|
|
|
for _, proto := range protos {
|
|
|
|
|
if _, err := ps.PublishCommon(dt, user, pes.(*peer.Peer).PeerID, proto, resource); err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
2026-02-09 13:28:00 +01:00
|
|
|
}
|
|
|
|
|
}
|
2026-03-03 16:38:24 +01:00
|
|
|
return nil
|
2026-02-09 13:28:00 +01:00
|
|
|
}
|
|
|
|
|
|
2026-03-03 16:38:24 +01:00
|
|
|
func (ps *StreamService) PublishCommon(dt *tools.DataType, user string, toPeerID string, proto protocol.ID, resource []byte) (*common.Stream, error) {
|
|
|
|
|
fmt.Println("PublishCommon")
|
|
|
|
|
if toPeerID == ps.Key.String() {
|
|
|
|
|
return nil, errors.New("Can't send to ourself !")
|
2026-01-30 16:57:36 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
access := oclib.NewRequestAdmin(oclib.LibDataEnum(oclib.PEER), nil)
|
2026-03-03 16:38:24 +01:00
|
|
|
p := access.Search(&dbs.Filters{
|
|
|
|
|
And: map[string][]dbs.Filter{ // search by name if no filters are provided
|
|
|
|
|
"peer_id": {{Operator: dbs.EQUAL.String(), Value: toPeerID}},
|
2026-02-02 12:14:01 +01:00
|
|
|
},
|
2026-03-03 16:38:24 +01:00
|
|
|
}, toPeerID, false)
|
|
|
|
|
var pe *peer.Peer
|
|
|
|
|
if len(p.Data) > 0 && p.Data[0].(*peer.Peer).Relation != peer.BLACKLIST {
|
|
|
|
|
pe = p.Data[0].(*peer.Peer)
|
|
|
|
|
} else if pps, err := ps.Node.GetPeerRecord(context.Background(), toPeerID); err == nil && len(pps) > 0 {
|
|
|
|
|
pe = pps[0]
|
2026-01-30 16:57:36 +01:00
|
|
|
}
|
2026-03-03 16:38:24 +01:00
|
|
|
if pe != nil {
|
|
|
|
|
ad, err := pp.AddrInfoFromString(p.Data[0].(*peer.Peer).StreamAddress)
|
2026-01-30 16:57:36 +01:00
|
|
|
if err != nil {
|
2026-03-03 16:38:24 +01:00
|
|
|
return nil, err
|
2026-01-30 16:57:36 +01:00
|
|
|
}
|
2026-03-03 16:38:24 +01:00
|
|
|
return ps.write(toPeerID, ad, dt, user, resource, proto)
|
2026-01-30 16:57:36 +01:00
|
|
|
}
|
2026-03-03 16:38:24 +01:00
|
|
|
return nil, errors.New("peer unvalid " + toPeerID)
|
2026-01-30 16:57:36 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (ps *StreamService) ToPartnerPublishEvent(
|
|
|
|
|
ctx context.Context, action tools.PubSubAction, dt *tools.DataType, user string, payload []byte) error {
|
2026-02-02 12:43:43 +01:00
|
|
|
if *dt == tools.PEER {
|
|
|
|
|
var p peer.Peer
|
|
|
|
|
if err := json.Unmarshal(payload, &p); err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
2026-02-17 13:11:22 +01:00
|
|
|
pid, err := pp.Decode(p.PeerID)
|
2026-02-02 12:43:43 +01:00
|
|
|
if err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
2026-03-03 16:38:24 +01:00
|
|
|
|
|
|
|
|
if pe, err := oclib.GetMySelf(); err != nil {
|
|
|
|
|
return err
|
|
|
|
|
} else if pe.GetID() == p.GetID() {
|
|
|
|
|
return fmt.Errorf("can't send to ourself")
|
|
|
|
|
} else {
|
|
|
|
|
pe.Relation = p.Relation
|
|
|
|
|
pe.Verify = false
|
|
|
|
|
if b2, err := json.Marshal(pe); err == nil {
|
|
|
|
|
if _, err := ps.PublishCommon(dt, user, p.PeerID, ProtocolUpdateResource, b2); err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
if p.Relation == peer.PARTNER {
|
|
|
|
|
if ps.Streams[ProtocolHeartbeatPartner] == nil {
|
|
|
|
|
ps.Streams[ProtocolHeartbeatPartner] = map[pp.ID]*common.Stream{}
|
|
|
|
|
}
|
|
|
|
|
fmt.Println("SHOULD CONNECT")
|
|
|
|
|
ps.ConnectToPartner(p.StreamAddress)
|
|
|
|
|
} else if ps.Streams[ProtocolHeartbeatPartner] != nil && ps.Streams[ProtocolHeartbeatPartner][pid] != nil {
|
|
|
|
|
for _, pids := range ps.Streams {
|
|
|
|
|
if pids[pid] != nil {
|
|
|
|
|
delete(pids, pid)
|
|
|
|
|
}
|
|
|
|
|
}
|
2026-02-02 12:43:43 +01:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return nil
|
|
|
|
|
}
|
2026-03-03 16:38:24 +01:00
|
|
|
ks := []protocol.ID{}
|
|
|
|
|
for k := range protocolsPartners {
|
|
|
|
|
ks = append(ks, k)
|
2026-01-30 16:57:36 +01:00
|
|
|
}
|
2026-03-03 16:38:24 +01:00
|
|
|
ps.PublishesCommon(dt, user, &dbs.Filters{ // filter by like name, short_description, description, owner, url if no filters are provided
|
|
|
|
|
And: map[string][]dbs.Filter{
|
|
|
|
|
"relation": {{Operator: dbs.EQUAL.String(), Value: peer.PARTNER}},
|
|
|
|
|
},
|
|
|
|
|
}, payload, ks...)
|
2026-01-30 16:57:36 +01:00
|
|
|
return nil
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (s *StreamService) write(
|
|
|
|
|
did string,
|
|
|
|
|
peerID *pp.AddrInfo,
|
|
|
|
|
dt *tools.DataType,
|
|
|
|
|
user string,
|
|
|
|
|
payload []byte,
|
2026-02-18 13:29:50 +01:00
|
|
|
proto protocol.ID) (*common.Stream, error) {
|
2026-01-30 16:57:36 +01:00
|
|
|
logger := oclib.GetLogger()
|
2026-02-18 13:29:50 +01:00
|
|
|
var err error
|
2026-02-24 14:31:37 +01:00
|
|
|
pts := map[protocol.ID]*common.ProtocolInfo{}
|
|
|
|
|
for k, v := range protocols {
|
|
|
|
|
pts[k] = v
|
|
|
|
|
}
|
|
|
|
|
for k, v := range protocolsPartners {
|
|
|
|
|
pts[k] = v
|
|
|
|
|
}
|
2026-02-18 13:29:50 +01:00
|
|
|
// should create a very temp stream
|
2026-02-24 14:31:37 +01:00
|
|
|
if s.Streams, err = common.TempStream(s.Host, *peerID, proto, did, s.Streams, pts, &s.Mu); err != nil {
|
2026-02-09 13:28:00 +01:00
|
|
|
return nil, errors.New("no stream available for protocol " + fmt.Sprintf("%v", proto) + " from PID " + peerID.ID.String())
|
2026-02-18 13:29:50 +01:00
|
|
|
|
2026-01-30 16:57:36 +01:00
|
|
|
}
|
|
|
|
|
stream := s.Streams[proto][peerID.ID]
|
2026-02-18 13:29:50 +01:00
|
|
|
evt := common.NewEvent(string(proto), peerID.ID.String(), dt, user, payload)
|
2026-03-03 16:38:24 +01:00
|
|
|
fmt.Println("SEND EVENT ", evt.From, evt.DataType, evt.Timestamp)
|
2026-02-18 13:29:50 +01:00
|
|
|
if err := json.NewEncoder(stream.Stream).Encode(evt); err != nil {
|
2026-01-30 16:57:36 +01:00
|
|
|
stream.Stream.Close()
|
|
|
|
|
logger.Err(err)
|
2026-02-09 13:28:00 +01:00
|
|
|
return stream, nil
|
2026-01-30 16:57:36 +01:00
|
|
|
}
|
2026-02-09 13:28:00 +01:00
|
|
|
return stream, nil
|
2026-01-30 16:57:36 +01:00
|
|
|
}
|