Files
oc-discovery/daemons/node/nats.go

226 lines
7.3 KiB
Go
Raw Normal View History

package node
2026-01-28 17:22:29 +01:00
import (
"context"
"encoding/json"
"fmt"
2026-02-05 16:17:14 +01:00
"oc-discovery/daemons/node/common"
2026-02-24 14:31:37 +01:00
"oc-discovery/daemons/node/stream"
2026-01-28 17:22:29 +01:00
2026-02-05 16:17:14 +01:00
oclib "cloud.o-forge.io/core/oc-lib"
"cloud.o-forge.io/core/oc-lib/config"
"cloud.o-forge.io/core/oc-lib/models/peer"
2026-01-28 17:22:29 +01:00
"cloud.o-forge.io/core/oc-lib/tools"
2026-02-05 16:17:14 +01:00
pp "github.com/libp2p/go-libp2p/core/peer"
2026-02-24 14:31:37 +01:00
"github.com/libp2p/go-libp2p/core/protocol"
2026-01-28 17:22:29 +01:00
)
2026-02-24 14:31:37 +01:00
type configPayload struct {
PeerID string `json:"source_peer_id"`
}
type executionConsidersPayload struct {
PeerIDs []string `json:"peer_ids"`
}
func ListenNATS(n *Node) {
2026-01-28 17:22:29 +01:00
tools.NewNATSCaller().ListenNats(map[tools.NATSMethod]func(tools.NATSResponse){
/*tools.VERIFY_RESOURCE: func(resp tools.NATSResponse) {
if resp.FromApp == config.GetAppName() {
return
}
if res, err := resources.ToResource(resp.Datatype.EnumIndex(), resp.Payload); err == nil {
access := oclib.NewRequestAdmin(oclib.LibDataEnum(oclib.PEER), nil)
p := access.LoadOne(res.GetCreatorID())
realP := p.ToPeer()
if realP == nil {
return
} else if realP.Relation == peer.SELF {
pubKey, err := common.PubKeyFromString(realP.PublicKey) // extract pubkey from pubkey str
if err != nil {
return
}
ok, _ := pubKey.Verify(resp.Payload, res.GetSignature())
if b, err := json.Marshal(stream.Verify{
IsVerified: ok,
}); err == nil {
tools.NewNATSCaller().SetNATSPub(tools.VERIFY_RESOURCE, tools.NATSResponse{
FromApp: "oc-discovery",
Method: int(tools.VERIFY_RESOURCE),
Payload: b,
})
}
} else if realP.Relation != peer.BLACKLIST {
n.StreamService.PublishVerifyResources(&resp.Datatype, resp.User, realP.PeerID, resp.Payload)
}
}
},*/
tools.CREATE_RESOURCE: func(resp tools.NATSResponse) {
2026-02-24 14:31:37 +01:00
if resp.FromApp == config.GetAppName() && resp.Datatype != tools.PEER && resp.Datatype != tools.WORKFLOW {
2026-02-05 16:17:14 +01:00
return
}
logger := oclib.GetLogger()
m := map[string]interface{}{}
err := json.Unmarshal(resp.Payload, &m)
if err != nil {
logger.Err(err)
return
}
p := &peer.Peer{}
p = p.Deserialize(m, p).(*peer.Peer)
2026-02-17 13:11:22 +01:00
ad, err := pp.AddrInfoFromString(p.StreamAddress)
if err != nil {
return
}
2026-02-05 16:17:14 +01:00
n.StreamService.Mu.Lock()
defer n.StreamService.Mu.Unlock()
if p.Relation == peer.PARTNER {
2026-02-17 13:11:22 +01:00
n.StreamService.ConnectToPartner(p.StreamAddress)
2026-02-05 16:17:14 +01:00
} else {
ps := common.ProtocolStream{}
for p, s := range n.StreamService.Streams {
m := map[pp.ID]*common.Stream{}
for k := range s {
if ad.ID != k {
m[k] = s[k]
2026-02-05 16:17:33 +01:00
} else {
s[k].Stream.Close()
2026-02-05 16:17:14 +01:00
}
}
ps[p] = m
}
n.StreamService.Streams = ps
}
2026-02-05 16:17:14 +01:00
},
2026-01-28 17:22:29 +01:00
tools.PROPALGATION_EVENT: func(resp tools.NATSResponse) {
2026-03-03 16:38:24 +01:00
fmt.Println("PROPALGATION")
2026-02-24 14:31:37 +01:00
if resp.FromApp == config.GetAppName() {
return
}
2026-01-28 17:22:29 +01:00
var propalgation tools.PropalgationMessage
err := json.Unmarshal(resp.Payload, &propalgation)
var dt *tools.DataType
if propalgation.DataType > 0 {
dtt := tools.DataType(propalgation.DataType)
dt = &dtt
}
2026-03-03 16:38:24 +01:00
fmt.Println("PROPALGATION ACT", propalgation.Action, propalgation.Action == tools.PB_CREATE, err)
2026-01-28 17:22:29 +01:00
if err == nil {
switch propalgation.Action {
2026-03-03 16:38:24 +01:00
case tools.PB_ADMIRALTY_CONFIG, tools.PB_MINIO_CONFIG:
2026-02-24 14:31:37 +01:00
var m configPayload
var proto protocol.ID = stream.ProtocolAdmiraltyConfigResource
if propalgation.Action == tools.PB_MINIO_CONFIG {
proto = stream.ProtocolMinioConfigResource
}
if err := json.Unmarshal(resp.Payload, &m); err == nil {
peers, _ := n.GetPeerRecord(context.Background(), m.PeerID)
for _, p := range peers {
n.StreamService.PublishCommon(&resp.Datatype, resp.User,
p.PeerID, proto, resp.Payload)
}
}
2026-03-03 16:38:24 +01:00
case tools.PB_CREATE, tools.PB_UPDATE, tools.PB_DELETE:
fmt.Println(propalgation.Action, dt, resp.User, propalgation.Payload)
fmt.Println(n.StreamService.ToPartnerPublishEvent(
2026-01-28 17:22:29 +01:00
context.Background(),
propalgation.Action,
2026-01-28 17:31:34 +01:00
dt, resp.User,
2026-01-28 17:22:29 +01:00
propalgation.Payload,
2026-03-03 16:38:24 +01:00
))
2026-02-24 14:31:37 +01:00
case tools.PB_CONSIDERS:
switch resp.Datatype {
2026-03-03 16:38:24 +01:00
case tools.BOOKING, tools.PURCHASE_RESOURCE, tools.WORKFLOW_EXECUTION:
2026-02-24 14:31:37 +01:00
var m executionConsidersPayload
if err := json.Unmarshal(resp.Payload, &m); err == nil {
for _, p := range m.PeerIDs {
peers, _ := n.GetPeerRecord(context.Background(), p)
for _, pp := range peers {
n.StreamService.PublishCommon(&resp.Datatype, resp.User,
pp.PeerID, stream.ProtocolConsidersResource, resp.Payload)
}
}
}
2026-02-26 09:14:34 +01:00
default:
// minio / admiralty config considers — route back to OriginID.
var m struct {
OriginID string `json:"origin_id"`
}
if err := json.Unmarshal(propalgation.Payload, &m); err == nil && m.OriginID != "" {
peers, _ := n.GetPeerRecord(context.Background(), m.OriginID)
for _, p := range peers {
n.StreamService.PublishCommon(nil, resp.User,
p.PeerID, stream.ProtocolConsidersResource, propalgation.Payload)
}
}
2026-02-24 14:31:37 +01:00
}
case tools.PB_PLANNER:
2026-01-28 17:22:29 +01:00
m := map[string]interface{}{}
2026-02-24 14:31:37 +01:00
if err := json.Unmarshal(resp.Payload, &m); err == nil {
b := []byte{}
if len(m) > 1 {
b = resp.Payload
}
if m["peer_id"] == nil { // send to every active stream
n.StreamService.Mu.Lock()
if n.StreamService.Streams[stream.ProtocolSendPlanner] != nil {
for pid := range n.StreamService.Streams[stream.ProtocolSendPlanner] {
n.StreamService.PublishCommon(nil, resp.User, pid.String(), stream.ProtocolSendPlanner, b)
}
}
} else {
n.StreamService.PublishCommon(nil, resp.User, fmt.Sprintf("%v", m["peer_id"]), stream.ProtocolSendPlanner, b)
}
n.StreamService.Mu.Unlock()
}
case tools.PB_CLOSE_PLANNER:
m := map[string]interface{}{}
if err := json.Unmarshal(resp.Payload, &m); err == nil {
n.StreamService.Mu.Lock()
if pid, err := pp.Decode(fmt.Sprintf("%v", m["peer_id"])); err == nil {
if n.StreamService.Streams[stream.ProtocolSendPlanner] != nil && n.StreamService.Streams[stream.ProtocolSendPlanner][pid] != nil {
n.StreamService.Streams[stream.ProtocolSendPlanner][pid].Stream.Close()
delete(n.StreamService.Streams[stream.ProtocolSendPlanner], pid)
}
}
n.StreamService.Mu.Unlock()
}
case tools.PB_SEARCH:
if propalgation.DataType == int(tools.PEER) {
m := map[string]interface{}{}
if err := json.Unmarshal(propalgation.Payload, &m); err == nil {
if peers, err := n.GetPeerRecord(context.Background(), fmt.Sprintf("%v", m["search"])); err == nil {
for _, p := range peers {
if b, err := json.Marshal(p); err == nil {
go tools.NewNATSCaller().SetNATSPub(tools.SEARCH_EVENT, tools.NATSResponse{
FromApp: "oc-discovery",
Datatype: tools.DataType(tools.PEER),
Method: int(tools.SEARCH_EVENT),
Payload: b,
})
}
}
}
}
} else {
m := map[string]interface{}{}
if err := json.Unmarshal(propalgation.Payload, &m); err == nil {
n.PubSubService.SearchPublishEvent(
context.Background(),
dt,
fmt.Sprintf("%v", m["type"]),
resp.User,
fmt.Sprintf("%v", m["search"]),
)
}
}
2026-01-28 17:22:29 +01:00
}
}
},
})
}