diff --git a/controllers/compute.go b/controllers/compute.go index e6f5228..132b948 100755 --- a/controllers/compute.go +++ b/controllers/compute.go @@ -32,7 +32,12 @@ func (o *ComputeController) Put() { data := oclib.NewRequest(comp_collection, user, peerID, groups, nil).UpdateOne(res, id) if data.Err == "" { data, _ := json.Marshal(data.Data.Serialize(data.Data)) - infrastructure.Singleton.UpdatePublishEvent(o.Ctx.Request.Context(), &comp_dt, user, data) + infrastructure.EmitNATS(tools.PropalgationMessage{ + Action: tools.PB_UPDATE, + DataType: comp_dt.EnumIndex(), + User: user, + Payload: data, + }) } o.Data["json"] = data o.ServeJSON() @@ -50,7 +55,12 @@ func (o *ComputeController) Post() { data := oclib.NewRequest(comp_collection, user, peerID, groups, nil).StoreOne(res) if data.Err == "" { data, _ := json.Marshal(data.Data.Serialize(data.Data)) - infrastructure.Singleton.CreatePublishEvent(o.Ctx.Request.Context(), &comp_dt, user, data) + infrastructure.EmitNATS(tools.PropalgationMessage{ + Action: tools.PB_CREATE, + DataType: comp_dt.EnumIndex(), + User: user, + Payload: data, + }) } o.Data["json"] = data o.ServeJSON() @@ -105,7 +115,12 @@ func (o *ComputeController) Delete() { data := oclib.NewRequest(comp_collection, user, peerID, groups, nil).DeleteOne(id) if data.Err == "" { data, _ := json.Marshal(data.Data.Serialize(data.Data)) - infrastructure.Singleton.DeletePublishEvent(o.Ctx.Request.Context(), &comp_dt, user, data) + infrastructure.EmitNATS(tools.PropalgationMessage{ + Action: tools.PB_DELETE, + DataType: comp_dt.EnumIndex(), + User: user, + Payload: data, + }) } o.Data["json"] = oclib.NewRequest(comp_collection, user, peerID, groups, nil).DeleteOne(id) o.ServeJSON() @@ -121,7 +136,16 @@ func (o *ComputeController) SearchDecentralized() { user, _, _ := oclib.ExtractTokenInfo(*o.Ctx.Request) search := o.Ctx.Input.Param(":search") t := o.Ctx.Input.Param(":type") - err := infrastructure.Singleton.SearchPublishEvent(o.Ctx.Request.Context(), &comp_dt, t, user, search) + b, err := json.Marshal(map[string]string{ + "search": search, + "type": t, + }) + infrastructure.EmitNATS(tools.PropalgationMessage{ + Action: tools.PB_SEARCH, + DataType: comp_dt.EnumIndex(), + User: user, + Payload: b, + }) if err != nil { o.Data["json"] = map[string]interface{}{ "data": nil, diff --git a/controllers/data.go b/controllers/data.go index 779f7f4..8293805 100755 --- a/controllers/data.go +++ b/controllers/data.go @@ -32,7 +32,12 @@ func (o *DataController) Put() { data := oclib.NewRequest(data_collection, user, peerID, groups, nil).UpdateOne(res, id) if data.Err == "" { data, _ := json.Marshal(data.Data.Serialize(data.Data)) - infrastructure.Singleton.UpdatePublishEvent(o.Ctx.Request.Context(), &data_dt, user, data) + infrastructure.EmitNATS(tools.PropalgationMessage{ + Action: tools.PB_UPDATE, + DataType: data_dt.EnumIndex(), + User: user, + Payload: data, + }) } o.Data["json"] = data o.ServeJSON() @@ -50,7 +55,12 @@ func (o *DataController) Post() { data := oclib.NewRequest(data_collection, user, peerID, groups, nil).StoreOne(res) if data.Err == "" { data, _ := json.Marshal(data.Data.Serialize(data.Data)) - infrastructure.Singleton.CreatePublishEvent(o.Ctx.Request.Context(), &data_dt, user, data) + infrastructure.EmitNATS(tools.PropalgationMessage{ + Action: tools.PB_CREATE, + DataType: data_dt.EnumIndex(), + User: user, + Payload: data, + }) } o.Data["json"] = data o.ServeJSON() @@ -106,7 +116,12 @@ func (o *DataController) Delete() { data := oclib.NewRequest(data_collection, user, peerID, groups, nil).DeleteOne(id) if data.Err == "" { data, _ := json.Marshal(data.Data.Serialize(data.Data)) - infrastructure.Singleton.DeletePublishEvent(o.Ctx.Request.Context(), &data_dt, user, data) + infrastructure.EmitNATS(tools.PropalgationMessage{ + Action: tools.PB_DELETE, + DataType: data_dt.EnumIndex(), + User: user, + Payload: data, + }) } o.Data["json"] = data o.ServeJSON() @@ -122,7 +137,16 @@ func (o *DataController) SearchDecentralized() { user, _, _ := oclib.ExtractTokenInfo(*o.Ctx.Request) search := o.Ctx.Input.Param(":search") t := o.Ctx.Input.Param(":type") - err := infrastructure.Singleton.SearchPublishEvent(o.Ctx.Request.Context(), &data_dt, t, user, search) + b, err := json.Marshal(map[string]string{ + "search": search, + "type": t, + }) + infrastructure.EmitNATS(tools.PropalgationMessage{ + Action: tools.PB_SEARCH, + DataType: data_dt.EnumIndex(), + User: user, + Payload: b, + }) if err != nil { o.Data["json"] = map[string]interface{}{ "data": nil, diff --git a/controllers/general.go b/controllers/general.go index 421b441..f05002d 100755 --- a/controllers/general.go +++ b/controllers/general.go @@ -66,7 +66,7 @@ func Websocket(ctx cx.Context, user string, r *context.Response, w *http.Request websocket.Handler(func(ws *websocket.Conn) { defer ws.Close() for { - if msg, ok := <-infrastructure.Singleton.SearchStream[user]; !ok || websocket.Message.Send(ws, msg) != nil { + if msg, ok := <-infrastructure.SearchStream[user]; !ok || websocket.Message.Send(ws, msg) != nil { return } } diff --git a/controllers/processing.go b/controllers/processing.go index d31cd19..b30faca 100755 --- a/controllers/processing.go +++ b/controllers/processing.go @@ -32,7 +32,12 @@ func (o *ProcessingController) Put() { data := oclib.NewRequest(processing_collection, user, peerID, groups, nil).UpdateOne(res, id) if data.Err == "" { data, _ := json.Marshal(data.Data.Serialize(data.Data)) - infrastructure.Singleton.UpdatePublishEvent(o.Ctx.Request.Context(), &processing_dt, user, data) + infrastructure.EmitNATS(tools.PropalgationMessage{ + Action: tools.PB_UPDATE, + DataType: processing_dt.EnumIndex(), + User: user, + Payload: data, + }) } o.Data["json"] = data o.ServeJSON() @@ -50,7 +55,12 @@ func (o *ProcessingController) Post() { data := oclib.NewRequest(processing_collection, user, peerID, groups, nil).StoreOne(res) if data.Err == "" { data, _ := json.Marshal(data.Data.Serialize(data.Data)) - infrastructure.Singleton.CreatePublishEvent(o.Ctx.Request.Context(), &processing_dt, user, data) + infrastructure.EmitNATS(tools.PropalgationMessage{ + Action: tools.PB_CREATE, + DataType: processing_dt.EnumIndex(), + User: user, + Payload: data, + }) } o.Data["json"] = data o.ServeJSON() @@ -105,7 +115,12 @@ func (o *ProcessingController) Delete() { data := oclib.NewRequest(processing_collection, user, peerID, groups, nil).DeleteOne(id) if data.Err == "" { data, _ := json.Marshal(data.Data.Serialize(data.Data)) - infrastructure.Singleton.DeletePublishEvent(o.Ctx.Request.Context(), &processing_dt, user, data) + infrastructure.EmitNATS(tools.PropalgationMessage{ + Action: tools.PB_DELETE, + DataType: processing_dt.EnumIndex(), + User: user, + Payload: data, + }) } o.Data["json"] = data o.ServeJSON() @@ -121,7 +136,16 @@ func (o *ProcessingController) SearchDecentralized() { user, _, _ := oclib.ExtractTokenInfo(*o.Ctx.Request) search := o.Ctx.Input.Param(":search") t := o.Ctx.Input.Param(":type") - err := infrastructure.Singleton.SearchPublishEvent(o.Ctx.Request.Context(), &processing_dt, t, user, search) + b, err := json.Marshal(map[string]string{ + "search": search, + "type": t, + }) + infrastructure.EmitNATS(tools.PropalgationMessage{ + Action: tools.PB_SEARCH, + DataType: processing_dt.EnumIndex(), + User: user, + Payload: b, + }) if err != nil { o.Data["json"] = map[string]interface{}{ "data": nil, diff --git a/controllers/resource.go b/controllers/resource.go index c587798..0f25395 100755 --- a/controllers/resource.go +++ b/controllers/resource.go @@ -1,10 +1,12 @@ package controllers import ( + "encoding/json" "fmt" "oc-catalog/infrastructure" oclib "cloud.o-forge.io/core/oc-lib" + "cloud.o-forge.io/core/oc-lib/tools" beego "github.com/beego/beego/v2/server/web" ) @@ -95,7 +97,16 @@ func (o *ResourceController) SearchDecentralized() { user, _, _ := oclib.ExtractTokenInfo(*o.Ctx.Request) search := o.Ctx.Input.Param(":search") t := o.Ctx.Input.Param(":type") - err := infrastructure.Singleton.SearchPublishEvent(o.Ctx.Request.Context(), nil, t, user, search) + b, err := json.Marshal(map[string]string{ + "search": search, + "type": t, + }) + infrastructure.EmitNATS(tools.PropalgationMessage{ + Action: tools.PB_SEARCH, + DataType: -1, + User: user, + Payload: b, + }) if err != nil { o.Data["json"] = map[string]interface{}{ "data": nil, diff --git a/controllers/storage.go b/controllers/storage.go index 688c4c8..1d459c1 100755 --- a/controllers/storage.go +++ b/controllers/storage.go @@ -32,7 +32,12 @@ func (o *StorageController) Put() { data := oclib.NewRequest(storage_collection, user, peerID, groups, nil).UpdateOne(res, id) if data.Err == "" { data, _ := json.Marshal(data.Data.Serialize(data.Data)) - infrastructure.Singleton.UpdatePublishEvent(o.Ctx.Request.Context(), &storage_dt, user, data) + infrastructure.EmitNATS(tools.PropalgationMessage{ + Action: tools.PB_UPDATE, + DataType: storage_dt.EnumIndex(), + User: user, + Payload: data, + }) } o.Data["json"] = data o.ServeJSON() @@ -50,7 +55,12 @@ func (o *StorageController) Post() { data := oclib.NewRequest(storage_collection, user, peerID, groups, nil).StoreOne(res) if data.Err == "" { data, _ := json.Marshal(data.Data.Serialize(data.Data)) - infrastructure.Singleton.CreatePublishEvent(o.Ctx.Request.Context(), &storage_dt, user, data) + infrastructure.EmitNATS(tools.PropalgationMessage{ + Action: tools.PB_CREATE, + DataType: storage_dt.EnumIndex(), + User: user, + Payload: data, + }) } o.Data["json"] = data o.ServeJSON() @@ -105,7 +115,12 @@ func (o *StorageController) Delete() { data := oclib.NewRequest(storage_collection, user, peerID, groups, nil).DeleteOne(id) if data.Err == "" { data, _ := json.Marshal(data.Data.Serialize(data.Data)) - infrastructure.Singleton.DeletePublishEvent(o.Ctx.Request.Context(), &storage_dt, user, data) + infrastructure.EmitNATS(tools.PropalgationMessage{ + Action: tools.PB_DELETE, + DataType: storage_dt.EnumIndex(), + User: user, + Payload: data, + }) } o.Data["json"] = data o.ServeJSON() @@ -121,7 +136,16 @@ func (o *StorageController) SearchDecentralized() { user, _, _ := oclib.ExtractTokenInfo(*o.Ctx.Request) search := o.Ctx.Input.Param(":search") t := o.Ctx.Input.Param(":type") - err := infrastructure.Singleton.SearchPublishEvent(o.Ctx.Request.Context(), &storage_dt, t, user, search) + b, err := json.Marshal(map[string]string{ + "search": search, + "type": t, + }) + infrastructure.EmitNATS(tools.PropalgationMessage{ + Action: tools.PB_SEARCH, + DataType: storage_dt.EnumIndex(), + User: user, + Payload: b, + }) if err != nil { o.Data["json"] = map[string]interface{}{ "data": nil, diff --git a/controllers/workflow.go b/controllers/workflow.go index c91afae..0c85a3c 100755 --- a/controllers/workflow.go +++ b/controllers/workflow.go @@ -32,7 +32,12 @@ func (o *WorkflowController) Put() { data := oclib.NewRequest(workflow_collection, user, peerID, groups, nil).UpdateOne(res, id) if data.Err == "" { data, _ := json.Marshal(data.Data.Serialize(data.Data)) - infrastructure.Singleton.UpdatePublishEvent(o.Ctx.Request.Context(), &workflow_dt, user, data) + infrastructure.EmitNATS(tools.PropalgationMessage{ + Action: tools.PB_UPDATE, + Payload: data, + DataType: workflow_dt.EnumIndex(), + User: user, + }) } o.Data["json"] = data o.ServeJSON() @@ -50,7 +55,12 @@ func (o *WorkflowController) Post() { data := oclib.NewRequest(workflow_collection, user, peerID, groups, nil).StoreOne(res) if data.Err == "" { data, _ := json.Marshal(data.Data.Serialize(data.Data)) - infrastructure.Singleton.CreatePublishEvent(o.Ctx.Request.Context(), &workflow_dt, user, data) + infrastructure.EmitNATS(tools.PropalgationMessage{ + Action: tools.PB_CREATE, + DataType: workflow_dt.EnumIndex(), + User: user, + Payload: data, + }) } o.Data["json"] = data o.ServeJSON() @@ -92,7 +102,10 @@ func (o *WorkflowController) SearchDecentralized() { user, _, _ := oclib.ExtractTokenInfo(*o.Ctx.Request) search := o.Ctx.Input.Param(":search") t := o.Ctx.Input.Param(":type") - err := infrastructure.Singleton.SearchPublishEvent(o.Ctx.Request.Context(), &workflow_dt, t, user, search) + b, err := json.Marshal(map[string]string{ + "search": search, + "type": t, + }) if err != nil { o.Data["json"] = map[string]interface{}{ "data": nil, @@ -102,6 +115,12 @@ func (o *WorkflowController) SearchDecentralized() { o.ServeJSON() return } + infrastructure.EmitNATS(tools.PropalgationMessage{ + Action: tools.PB_SEARCH, + DataType: workflow_dt.EnumIndex(), + User: user, + Payload: b, + }) Websocket(o.Ctx.Request.Context(), user, o.Ctx.ResponseWriter, o.Ctx.Request) } @@ -128,7 +147,12 @@ func (o *WorkflowController) Delete() { data := oclib.NewRequest(workflow_collection, user, peerID, groups, nil).DeleteOne(id) if data.Err == "" { data, _ := json.Marshal(data.Data.Serialize(data.Data)) - infrastructure.Singleton.DeletePublishEvent(o.Ctx.Request.Context(), &workflow_dt, user, data) + infrastructure.EmitNATS(tools.PropalgationMessage{ + DataType: workflow_dt.EnumIndex(), + Action: tools.PB_DELETE, + User: user, + Payload: data, + }) } o.Data["json"] = data o.ServeJSON() diff --git a/go.mod b/go.mod index 32588ed..0af94d3 100755 --- a/go.mod +++ b/go.mod @@ -5,38 +5,12 @@ go 1.24 toolchain go1.24.0 require ( - cloud.o-forge.io/core/oc-lib v0.0.0-20260127143728-3c052bf16572 + cloud.o-forge.io/core/oc-lib v0.0.0-20260128160440-c0d89ea9e1e8 github.com/beego/beego/v2 v2.3.4 - github.com/libp2p/go-libp2p v0.39.1 github.com/smartystreets/goconvey v1.7.2 ) -require ( - github.com/decred/dcrd/dcrec/secp256k1/v4 v4.3.0 // indirect - github.com/gogo/protobuf v1.3.2 // indirect - github.com/hashicorp/golang-lru/v2 v2.0.7 // indirect - github.com/ipfs/go-cid v0.5.0 // indirect - github.com/ipfs/go-log/v2 v2.5.1 // indirect - github.com/klauspost/cpuid/v2 v2.2.9 // indirect - github.com/libp2p/go-buffer-pool v0.1.0 // indirect - github.com/libp2p/go-msgio v0.3.0 // indirect - github.com/minio/sha256-simd v1.0.1 // indirect - github.com/mr-tron/base58 v1.2.0 // indirect - github.com/multiformats/go-base32 v0.1.0 // indirect - github.com/multiformats/go-base36 v0.2.0 // indirect - github.com/multiformats/go-multiaddr v0.14.0 // indirect - github.com/multiformats/go-multiaddr-fmt v0.1.0 // indirect - github.com/multiformats/go-multibase v0.2.0 // indirect - github.com/multiformats/go-multicodec v0.9.0 // indirect - github.com/multiformats/go-multihash v0.2.3 // indirect - github.com/multiformats/go-multistream v0.6.0 // indirect - github.com/multiformats/go-varint v0.0.7 // indirect - github.com/spaolacci/murmur3 v1.1.0 // indirect - go.uber.org/multierr v1.11.0 // indirect - go.uber.org/zap v1.27.0 // indirect - golang.org/x/exp v0.0.0-20250128182459-e0ece0dbea4c // indirect - lukechampine.com/blake3 v1.3.0 // indirect -) +require github.com/kr/text v0.2.0 // indirect require ( github.com/beorn7/perks v1.0.1 // indirect @@ -55,7 +29,6 @@ require ( github.com/jtolds/gls v4.20.0+incompatible // indirect github.com/klauspost/compress v1.18.0 // indirect github.com/leodido/go-urn v1.4.0 // indirect - github.com/libp2p/go-libp2p-pubsub v0.15.0 github.com/mattn/go-colorable v0.1.14 // indirect github.com/mattn/go-isatty v0.0.20 // indirect github.com/mitchellh/mapstructure v1.5.0 // indirect @@ -79,7 +52,7 @@ require ( github.com/youmark/pkcs8 v0.0.0-20240726163527-a2c0da244d78 // indirect go.mongodb.org/mongo-driver v1.17.4 // indirect golang.org/x/crypto v0.39.0 // indirect - golang.org/x/net v0.41.0 // indirect + golang.org/x/net v0.41.0 golang.org/x/sync v0.15.0 // indirect golang.org/x/sys v0.33.0 // indirect golang.org/x/text v0.26.0 // indirect diff --git a/go.sum b/go.sum index d0699b3..808e512 100755 --- a/go.sum +++ b/go.sum @@ -1,54 +1,25 @@ -cloud.o-forge.io/core/oc-lib v0.0.0-20260127083751-c69069449f1e h1:2WY0uwtE4tLVsowfZj51I8kZawjf9s2Cx6lozqNv6eg= -cloud.o-forge.io/core/oc-lib v0.0.0-20260127083751-c69069449f1e/go.mod h1:vHWauJsS6ryf7UDqq8hRXoYD5RsONxcFTxeZPOztEuI= -cloud.o-forge.io/core/oc-lib v0.0.0-20260127085007-d772a703da53 h1:Jdhy1TsvhpOk4Oitid1v7G801o6tvOZwxV+humUNx6g= -cloud.o-forge.io/core/oc-lib v0.0.0-20260127085007-d772a703da53/go.mod h1:vHWauJsS6ryf7UDqq8hRXoYD5RsONxcFTxeZPOztEuI= -cloud.o-forge.io/core/oc-lib v0.0.0-20260127095938-9b4f9e420aab h1:mnr3P4k0MM5oFFpK6uPmZ1JOfvVMpeV3efYJny4y+6A= -cloud.o-forge.io/core/oc-lib v0.0.0-20260127095938-9b4f9e420aab/go.mod h1:vHWauJsS6ryf7UDqq8hRXoYD5RsONxcFTxeZPOztEuI= -cloud.o-forge.io/core/oc-lib v0.0.0-20260127101428-4d577670053d h1:c6VEY9YyXjRMNl1QW3HguBrJPmrAk7DSIGPE6NGRZXU= -cloud.o-forge.io/core/oc-lib v0.0.0-20260127101428-4d577670053d/go.mod h1:vHWauJsS6ryf7UDqq8hRXoYD5RsONxcFTxeZPOztEuI= -cloud.o-forge.io/core/oc-lib v0.0.0-20260127114951-9af8d1567246 h1:XjpuaejE3fshKZFRpB4EEVhTbQ726GaD7x941idwfWs= -cloud.o-forge.io/core/oc-lib v0.0.0-20260127114951-9af8d1567246/go.mod h1:vHWauJsS6ryf7UDqq8hRXoYD5RsONxcFTxeZPOztEuI= -cloud.o-forge.io/core/oc-lib v0.0.0-20260127143728-3c052bf16572 h1:jrUHgs4DqNWLnLcb5nd4lrJim77+aGkJFACUfMogiu8= -cloud.o-forge.io/core/oc-lib v0.0.0-20260127143728-3c052bf16572/go.mod h1:vHWauJsS6ryf7UDqq8hRXoYD5RsONxcFTxeZPOztEuI= +cloud.o-forge.io/core/oc-lib v0.0.0-20260128160440-c0d89ea9e1e8 h1:h7VHJktaTT8TxO4ld3Xjw3LzMsivr3m7mzbNxb44zes= +cloud.o-forge.io/core/oc-lib v0.0.0-20260128160440-c0d89ea9e1e8/go.mod h1:vHWauJsS6ryf7UDqq8hRXoYD5RsONxcFTxeZPOztEuI= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/beego/beego/v2 v2.3.4 h1:HurQEOGIEhLlPFCTR6ZDuQkybrUl2Ag2i6CdVD2rGiI= github.com/beego/beego/v2 v2.3.4/go.mod h1:5cqHsOHJIxkq44tBpRvtDe59GuVRVv/9/tyVDxd5ce4= -github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= -github.com/benbjohnson/clock v1.3.5 h1:VvXlSJBzZpA/zum6Sj74hxwYI2DIxRWuNIoXAzHZz5o= -github.com/benbjohnson/clock v1.3.5/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= github.com/biter777/countries v1.7.5 h1:MJ+n3+rSxWQdqVJU8eBy9RqcdH6ePPn4PJHocVWUa+Q= github.com/biter777/countries v1.7.5/go.mod h1:1HSpZ526mYqKJcpT5Ti1kcGQ0L0SrXWIaptUWjFfv2E= github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/containerd/cgroups v1.1.0 h1:v8rEWFl6EoqHB+swVNjVoCJE8o3jX7e8nqBGPLaDFBM= -github.com/containerd/cgroups v1.1.0/go.mod h1:6ppBcbh/NOOUU+dMKrykgaBnK9lCIBxHqJDGwsa1mIw= github.com/coreos/etcd v3.3.17+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= -github.com/coreos/go-systemd/v22 v22.5.0 h1:RrqgGjYQKalulkV8NGVIfkXQf6YYmOyiJKk8iXXhfZs= github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= +github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davidlazar/go-crypto v0.0.0-20200604182044-b73af7476f6c h1:pFUpOrbxDR6AkioZ1ySsx5yxlDQZ8stG2b88gTPxgJU= -github.com/davidlazar/go-crypto v0.0.0-20200604182044-b73af7476f6c/go.mod h1:6UhI8N9EjYm1c2odKpFpAYeR8dsBeM7PtzQhRgxRr9U= -github.com/decred/dcrd/crypto/blake256 v1.0.1 h1:7PltbUIQB7u/FfZ39+DGa/ShuMyJ5ilcvdfma9wOH6Y= -github.com/decred/dcrd/crypto/blake256 v1.0.1/go.mod h1:2OfgNZ5wDpcsFmHmCK5gZTPcCXqlm2ArzUIkw9czNJo= -github.com/decred/dcrd/dcrec/secp256k1/v4 v4.3.0 h1:rpfIENRNNilwHwZeG5+P150SMrnNEcHYvcCuK6dPZSg= -github.com/decred/dcrd/dcrec/secp256k1/v4 v4.3.0/go.mod h1:v57UDF4pDQJcEfFUCRop3lJL149eHGSe9Jvczhzjo/0= -github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4= -github.com/docker/go-units v0.5.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= -github.com/elastic/gosigar v0.14.3 h1:xwkKwPia+hSfg9GqrCUKYdId102m9qTJIIr7egmK/uo= -github.com/elastic/gosigar v0.14.3/go.mod h1:iXRIGg2tLnu7LBdpqzyQfGDEidKCfWcCMS0WKyPWoMs= github.com/elazarl/go-bindata-assetfs v1.0.1 h1:m0kkaHRKEu7tUIUFVwhGGGYClXvyl4RE03qmvRTNfbw= github.com/elazarl/go-bindata-assetfs v1.0.1/go.mod h1:v+YaWX3bdea5J/mo8dSETolEo7R71Vk1u8bnjau5yw4= github.com/etcd-io/etcd v3.3.17+incompatible/go.mod h1:cdZ77EstHBwVtD6iTgzgvogwcjo9m4iOqoijouPJ4bs= -github.com/flynn/noise v1.1.0 h1:KjPQoQCEFdZDiP03phOvGi11+SVVhBG2wOWAorLsstg= -github.com/flynn/noise v1.1.0/go.mod h1:xbMo+0i6+IGbYdJhF31t2eR1BIU0CYc12+BNAKwUTag= -github.com/francoispqt/gojay v1.2.13 h1:d2m3sFjloqoIUQU3TsHBgj6qg/BVGlTBeHDUmyJnXKk= -github.com/francoispqt/gojay v1.2.13/go.mod h1:ehT5mTG4ua4581f1++1WLG0vPdaA9HaiDsoyrBGkyDY= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/gabriel-vasile/mimetype v1.4.9 h1:5k+WDwEsD9eTLL8Tz3L0VnmVh9QxGjRmjBvAG7U/oYY= github.com/gabriel-vasile/mimetype v1.4.9/go.mod h1:WnSQhFKJuBlRyLiKohA/2DtIlPFAbguNaG7QCHcyGok= @@ -60,110 +31,42 @@ github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJn github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY= github.com/go-playground/validator/v10 v10.27.0 h1:w8+XrWVMhGkxOaaowyKH35gFydVHOvC0/uWoy2Fzwn4= github.com/go-playground/validator/v10 v10.27.0/go.mod h1:I5QpIEbmr8On7W0TktmJAumgzX4CA1XNl4ZmDuVHKKo= -github.com/go-task/slim-sprig/v3 v3.0.0 h1:sUs3vkvUymDpBKi3qH1YSqBQk9+9D/8M2mN1vB6EwHI= -github.com/go-task/slim-sprig/v3 v3.0.0/go.mod h1:W848ghGpv3Qj3dhTPRyJypKRiqCdHZiAzKg9hl15HA8= github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= -github.com/godbus/dbus/v5 v5.1.0 h1:4KLkAxT3aOY8Li4FRJe/KvhoNFFxo0m6fNuFUO8QJUk= -github.com/godbus/dbus/v5 v5.1.0/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= -github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= -github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= github.com/golang/snappy v1.0.0 h1:Oy607GVXHs7RtbggtPBnr2RmDArIsAefDwvrdWvRhGs= github.com/golang/snappy v1.0.0/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/gopacket v1.1.19 h1:ves8RnFZPGiFnTS0uPQStjwru6uO6h+nlr9j6fL7kF8= -github.com/google/gopacket v1.1.19/go.mod h1:iJ8V8n6KS+z2U1A8pUwu8bW5SyEMkXJB8Yo/Vo+TKTo= -github.com/google/pprof v0.0.0-20250202011525-fc3143867406 h1:wlQI2cYY0BsWmmPPAnxfQ8SDW0S3Jasn+4B8kXFxprg= -github.com/google/pprof v0.0.0-20250202011525-fc3143867406/go.mod h1:vavhavw2zAxS5dIdcRluK6cSGGPlZynqzFM8NdvU144= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/goraz/onion v0.1.3 h1:KhyvbDA2b70gcz/d5izfwTiOH8SmrvV43AsVzpng3n0= github.com/goraz/onion v0.1.3/go.mod h1:XEmz1XoBz+wxTgWB8NwuvRm4RAu3vKxvrmYtzK+XCuQ= -github.com/gorilla/websocket v1.5.3 h1:saDtZ6Pbx/0u+bgYQ3q96pZgCzfhKXGPqt7kZ72aNNg= -github.com/gorilla/websocket v1.5.3/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/hashicorp/golang-lru v1.0.2 h1:dV3g9Z/unq5DpblPpw+Oqcv4dU/1omnb4Ok8iPY6p1c= github.com/hashicorp/golang-lru v1.0.2/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= -github.com/hashicorp/golang-lru/v2 v2.0.7 h1:a+bsQ5rvGLjzHuww6tVxozPZFVghXaHOwFs4luLUK2k= -github.com/hashicorp/golang-lru/v2 v2.0.7/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyfM2/ZepoAG6RGpeM= -github.com/huin/goupnp v1.3.0 h1:UvLUlWDNpoUdYzb2TCn+MuTWtcjXKSza2n6CBdQ0xXc= -github.com/huin/goupnp v1.3.0/go.mod h1:gnGPsThkYa7bFi/KWmEysQRf48l2dvR5bxr2OFckNX8= github.com/imdario/mergo v0.3.8/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= -github.com/ipfs/go-cid v0.5.0 h1:goEKKhaGm0ul11IHA7I6p1GmKz8kEYniqFopaB5Otwg= -github.com/ipfs/go-cid v0.5.0/go.mod h1:0L7vmeNXpQpUS9vt+yEARkJ8rOg43DF3iPgn4GIN0mk= -github.com/ipfs/go-log/v2 v2.5.1 h1:1XdUzF7048prq4aBjDQQ4SL5RxftpRGdXhNRwKSAlcY= -github.com/ipfs/go-log/v2 v2.5.1/go.mod h1:prSpmC1Gpllc9UYWxDiZDreBYw7zp4Iqp1kOLU9U5UI= -github.com/jackpal/go-nat-pmp v1.0.2 h1:KzKSgb7qkJvOUTqYl9/Hg/me3pWgBmERKrTGD7BdWus= -github.com/jackpal/go-nat-pmp v1.0.2/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc= -github.com/jbenet/go-temp-err-catcher v0.1.0 h1:zpb3ZH6wIE8Shj2sKS+khgRvf7T7RABoLk/+KKHggpk= -github.com/jbenet/go-temp-err-catcher v0.1.0/go.mod h1:0kJRvmDZXNMIiJirNPEYfhpPwbGVtZVWC34vc5WLsDk= github.com/json-iterator/go v1.1.8/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo= github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= -github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= -github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo= github.com/klauspost/compress v1.18.0/go.mod h1:2Pp+KzxcywXVXMr50+X0Q/Lsb43OQHYWRCY2AiWywWQ= -github.com/klauspost/cpuid/v2 v2.2.9 h1:66ze0taIn2H33fBvCkXuv9BmCwDfafmiIVpKV9kKGuY= -github.com/klauspost/cpuid/v2 v2.2.9/go.mod h1:rqkxqrZ1EhYM9G+hXH7YdowN5R5RGN6NK4QwQ3WMXF8= -github.com/koron/go-ssdp v0.0.5 h1:E1iSMxIs4WqxTbIBLtmNBeOOC+1sCIXQeqTWVnpmwhk= -github.com/koron/go-ssdp v0.0.5/go.mod h1:Qm59B7hpKpDqfyRNWRNr00jGwLdXjDyZh6y7rH6VS0w= -github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= -github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= -github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= github.com/leodido/go-urn v1.4.0 h1:WT9HwE9SGECu3lg4d/dIA+jxlljEa1/ffXKmRjqdmIQ= github.com/leodido/go-urn v1.4.0/go.mod h1:bvxc+MVxLKB4z00jd1z+Dvzr47oO32F/QSNjSBOlFxI= -github.com/libp2p/go-buffer-pool v0.1.0 h1:oK4mSFcQz7cTQIfqbe4MIj9gLW+mnanjyFtc6cdF0Y8= -github.com/libp2p/go-buffer-pool v0.1.0/go.mod h1:N+vh8gMqimBzdKkSMVuydVDq+UV5QTWy5HSiZacSbPg= -github.com/libp2p/go-flow-metrics v0.2.0 h1:EIZzjmeOE6c8Dav0sNv35vhZxATIXWZg6j/C08XmmDw= -github.com/libp2p/go-flow-metrics v0.2.0/go.mod h1:st3qqfu8+pMfh+9Mzqb2GTiwrAGjIPszEjZmtksN8Jc= -github.com/libp2p/go-libp2p v0.39.1 h1:1Ur6rPCf3GR+g8jkrnaQaM0ha2IGespsnNlCqJLLALE= -github.com/libp2p/go-libp2p v0.39.1/go.mod h1:3zicI8Lp7Isun+Afo/JOACUbbJqqR2owK6RQWFsVAbI= -github.com/libp2p/go-libp2p-asn-util v0.4.1 h1:xqL7++IKD9TBFMgnLPZR6/6iYhawHKHl950SO9L6n94= -github.com/libp2p/go-libp2p-asn-util v0.4.1/go.mod h1:d/NI6XZ9qxw67b4e+NgpQexCIiFYJjErASrYW4PFDN8= -github.com/libp2p/go-libp2p-pubsub v0.15.0 h1:cG7Cng2BT82WttmPFMi50gDNV+58K626m/wR00vGL1o= -github.com/libp2p/go-libp2p-pubsub v0.15.0/go.mod h1:lr4oE8bFgQaifRcoc2uWhWWiK6tPdOEKpUuR408GFN4= -github.com/libp2p/go-libp2p-testing v0.12.0 h1:EPvBb4kKMWO29qP4mZGyhVzUyR25dvfUIK5WDu6iPUA= -github.com/libp2p/go-libp2p-testing v0.12.0/go.mod h1:KcGDRXyN7sQCllucn1cOOS+Dmm7ujhfEyXQL5lvkcPg= -github.com/libp2p/go-msgio v0.3.0 h1:mf3Z8B1xcFN314sWX+2vOTShIE0Mmn2TXn3YCUQGNj0= -github.com/libp2p/go-msgio v0.3.0/go.mod h1:nyRM819GmVaF9LX3l03RMh10QdOroF++NBbxAb0mmDM= -github.com/libp2p/go-nat v0.2.0 h1:Tyz+bUFAYqGyJ/ppPPymMGbIgNRH+WqC5QrT5fKrrGk= -github.com/libp2p/go-nat v0.2.0/go.mod h1:3MJr+GRpRkyT65EpVPBstXLvOlAPzUVlG6Pwg9ohLJk= -github.com/libp2p/go-netroute v0.2.2 h1:Dejd8cQ47Qx2kRABg6lPwknU7+nBnFRpko45/fFPuZ8= -github.com/libp2p/go-netroute v0.2.2/go.mod h1:Rntq6jUAH0l9Gg17w5bFGhcC9a+vk4KNXs6s7IljKYE= -github.com/libp2p/go-reuseport v0.4.0 h1:nR5KU7hD0WxXCJbmw7r2rhRYruNRl2koHw8fQscQm2s= -github.com/libp2p/go-reuseport v0.4.0/go.mod h1:ZtI03j/wO5hZVDFo2jKywN6bYKWLOy8Se6DrI2E1cLU= -github.com/libp2p/go-yamux/v4 v4.0.2 h1:nrLh89LN/LEiqcFiqdKDRHjGstN300C1269K/EX0CPU= -github.com/libp2p/go-yamux/v4 v4.0.2/go.mod h1:C808cCRgOs1iBwY4S71T5oxgMxgLmqUw56qh4AeBW2o= github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= -github.com/marten-seemann/tcp v0.0.0-20210406111302-dfbc87cc63fd h1:br0buuQ854V8u83wA0rVZ8ttrq5CpaPZdvrK0LP2lOk= -github.com/marten-seemann/tcp v0.0.0-20210406111302-dfbc87cc63fd/go.mod h1:QuCEs1Nt24+FYQEqAAncTDPJIuGs+LxK1MCiFL25pMU= github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= github.com/mattn/go-colorable v0.1.14 h1:9A9LHSqF/7dyVVX6g0U9cwm9pG3kP9gSzcuIPHPsaIE= github.com/mattn/go-colorable v0.1.14/go.mod h1:6LmQG8QLFO4G5z1gPvYEzlUgJ2wF+stgPZH1UqBm1s8= -github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= -github.com/miekg/dns v1.1.63 h1:8M5aAw6OMZfFXTT7K5V0Eu5YiiL8l7nUAkyN6C9YwaY= -github.com/miekg/dns v1.1.63/go.mod h1:6NGHfjhpmr5lt3XPLuyfDJi5AXbNIPM9PY6H6sF1Nfs= -github.com/mikioh/tcpinfo v0.0.0-20190314235526-30a79bb1804b h1:z78hV3sbSMAUoyUMM0I83AUIT6Hu17AWfgjzIbtrYFc= -github.com/mikioh/tcpinfo v0.0.0-20190314235526-30a79bb1804b/go.mod h1:lxPUiZwKoFL8DUUmalo2yJJUCxbPKtm8OKfqr2/FTNU= -github.com/mikioh/tcpopt v0.0.0-20190314235656-172688c1accc h1:PTfri+PuQmWDqERdnNMiD9ZejrlswWrCpBEZgWOiTrc= -github.com/mikioh/tcpopt v0.0.0-20190314235656-172688c1accc/go.mod h1:cGKTAVKx4SxOuR/czcZ/E2RSJ3sfHs8FpHhQ5CWMf9s= -github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1/go.mod h1:pD8RvIylQ358TN4wwqatJ8rNavkEINozVn9DtGI3dfQ= -github.com/minio/sha256-simd v0.1.1-0.20190913151208-6de447530771/go.mod h1:B5e1o+1/KgNmWrSQK08Y6Z1Vb5pwIktudl0J58iy0KM= -github.com/minio/sha256-simd v1.0.1 h1:6kaan5IFmwTNynnKKpDHe6FWHohJOHhCPchzK49dzMM= -github.com/minio/sha256-simd v1.0.1/go.mod h1:Pz6AKMiUdngCLpeTL/RJY1M9rUuPMYujV5xJjtbRSN8= github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= @@ -173,31 +76,6 @@ github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lN github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/montanaflynn/stats v0.7.1 h1:etflOAAHORrCC44V+aR6Ftzort912ZU+YLiSTuV8eaE= github.com/montanaflynn/stats v0.7.1/go.mod h1:etXPPgVO6n31NxCd9KQUMvCM+ve0ruNzt6R8Bnaayow= -github.com/mr-tron/base58 v1.1.2/go.mod h1:BinMc/sQntlIE1frQmRFPUoPA1Zkr8VRgBdjWI2mNwc= -github.com/mr-tron/base58 v1.2.0 h1:T/HDJBh4ZCPbU39/+c3rRvE0uKBQlU27+QI8LJ4t64o= -github.com/mr-tron/base58 v1.2.0/go.mod h1:BinMc/sQntlIE1frQmRFPUoPA1Zkr8VRgBdjWI2mNwc= -github.com/multiformats/go-base32 v0.1.0 h1:pVx9xoSPqEIQG8o+UbAe7DNi51oej1NtK+aGkbLYxPE= -github.com/multiformats/go-base32 v0.1.0/go.mod h1:Kj3tFY6zNr+ABYMqeUNeGvkIC/UYgtWibDcT0rExnbI= -github.com/multiformats/go-base36 v0.2.0 h1:lFsAbNOGeKtuKozrtBsAkSVhv1p9D0/qedU9rQyccr0= -github.com/multiformats/go-base36 v0.2.0/go.mod h1:qvnKE++v+2MWCfePClUEjE78Z7P2a1UV0xHgWc0hkp4= -github.com/multiformats/go-multiaddr v0.1.1/go.mod h1:aMKBKNEYmzmDmxfX88/vz+J5IU55txyt0p4aiWVohjo= -github.com/multiformats/go-multiaddr v0.14.0 h1:bfrHrJhrRuh/NXH5mCnemjpbGjzRw/b+tJFOD41g2tU= -github.com/multiformats/go-multiaddr v0.14.0/go.mod h1:6EkVAxtznq2yC3QT5CM1UTAwG0GTP3EWAIcjHuzQ+r4= -github.com/multiformats/go-multiaddr-dns v0.4.1 h1:whi/uCLbDS3mSEUMb1MsoT4uzUeZB0N32yzufqS0i5M= -github.com/multiformats/go-multiaddr-dns v0.4.1/go.mod h1:7hfthtB4E4pQwirrz+J0CcDUfbWzTqEzVyYKKIKpgkc= -github.com/multiformats/go-multiaddr-fmt v0.1.0 h1:WLEFClPycPkp4fnIzoFoV9FVd49/eQsuaL3/CWe167E= -github.com/multiformats/go-multiaddr-fmt v0.1.0/go.mod h1:hGtDIW4PU4BqJ50gW2quDuPVjyWNZxToGUh/HwTZYJo= -github.com/multiformats/go-multibase v0.2.0 h1:isdYCVLvksgWlMW9OZRYJEa9pZETFivncJHmHnnd87g= -github.com/multiformats/go-multibase v0.2.0/go.mod h1:bFBZX4lKCA/2lyOFSAoKH5SS6oPyjtnzK/XTFDPkNuk= -github.com/multiformats/go-multicodec v0.9.0 h1:pb/dlPnzee/Sxv/j4PmkDRxCOi3hXTz3IbPKOXWJkmg= -github.com/multiformats/go-multicodec v0.9.0/go.mod h1:L3QTQvMIaVBkXOXXtVmYE+LI16i14xuaojr/H7Ai54k= -github.com/multiformats/go-multihash v0.0.8/go.mod h1:YSLudS+Pi8NHE7o6tb3D8vrpKa63epEDmG8nTduyAew= -github.com/multiformats/go-multihash v0.2.3 h1:7Lyc8XfX/IY2jWb/gI7JP+o7JEq9hOa7BFvVU9RSh+U= -github.com/multiformats/go-multihash v0.2.3/go.mod h1:dXgKXCXjBzdscBLk9JkjINiEsCKRVch90MdaGiKsvSM= -github.com/multiformats/go-multistream v0.6.0 h1:ZaHKbsL404720283o4c/IHQXiS6gb8qAN5EIJ4PN5EA= -github.com/multiformats/go-multistream v0.6.0/go.mod h1:MOyoG5otO24cHIg8kf9QW2/NozURlkP/rvi2FQJyCPg= -github.com/multiformats/go-varint v0.0.7 h1:sWSGR+f/eu5ABZA2ZpYKBILXTTs9JWpdEM/nEGOHFS8= -github.com/multiformats/go-varint v0.0.7/go.mod h1:r8PUYw/fD/SjBCiKOoDlGF6QawOELpZAu9eioSos/OU= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= github.com/nats-io/nats.go v1.43.0 h1:uRFZ2FEoRvP64+UUhaTokyS18XBCR/xM2vQZKO4i8ug= @@ -207,59 +85,7 @@ github.com/nats-io/nkeys v0.4.11/go.mod h1:szDimtgmfOi9n25JpfIdGw12tZFYXqhGxjhVx github.com/nats-io/nuid v1.0.1 h1:5iA8DT8V7q8WK2EScv2padNa/rTESc1KdnPw4TC2paw= github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c= github.com/ogier/pflag v0.0.1/go.mod h1:zkFki7tvTa0tafRvTBIZTvzYyAu6kQhPZFnshFFPE+g= -github.com/onsi/ginkgo/v2 v2.22.2 h1:/3X8Panh8/WwhU/3Ssa6rCKqPLuAkVY2I0RoyDLySlU= -github.com/onsi/ginkgo/v2 v2.22.2/go.mod h1:oeMosUL+8LtarXBHu/c0bx2D/K9zyQ6uX3cTyztHwsk= -github.com/opencontainers/runtime-spec v1.2.0 h1:z97+pHb3uELt/yiAWD691HNHQIF07bE7dzrbT927iTk= -github.com/opencontainers/runtime-spec v1.2.0/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= -github.com/pbnjay/memory v0.0.0-20210728143218-7b4eea64cf58 h1:onHthvaw9LFnH4t2DcNVpwGmV9E1BkGknEliJkfwQj0= -github.com/pbnjay/memory v0.0.0-20210728143218-7b4eea64cf58/go.mod h1:DXv8WO4yhMYhSNPKjeNKa5WY9YCIEBRbNzFFPJbWO6Y= github.com/pelletier/go-toml v1.6.0/go.mod h1:5N711Q9dKgbdkxHL+MEfF31hpT7l0S0s/t2kKREewys= -github.com/pion/datachannel v1.5.10 h1:ly0Q26K1i6ZkGf42W7D4hQYR90pZwzFOjTq5AuCKk4o= -github.com/pion/datachannel v1.5.10/go.mod h1:p/jJfC9arb29W7WrxyKbepTU20CFgyx5oLo8Rs4Py/M= -github.com/pion/dtls/v2 v2.2.12 h1:KP7H5/c1EiVAAKUmXyCzPiQe5+bCJrpOeKg/L05dunk= -github.com/pion/dtls/v2 v2.2.12/go.mod h1:d9SYc9fch0CqK90mRk1dC7AkzzpwJj6u2GU3u+9pqFE= -github.com/pion/dtls/v3 v3.0.4 h1:44CZekewMzfrn9pmGrj5BNnTMDCFwr+6sLH+cCuLM7U= -github.com/pion/dtls/v3 v3.0.4/go.mod h1:R373CsjxWqNPf6MEkfdy3aSe9niZvL/JaKlGeFphtMg= -github.com/pion/ice/v2 v2.3.37 h1:ObIdaNDu1rCo7hObhs34YSBcO7fjslJMZV0ux+uZWh0= -github.com/pion/ice/v2 v2.3.37/go.mod h1:mBF7lnigdqgtB+YHkaY/Y6s6tsyRyo4u4rPGRuOjUBQ= -github.com/pion/ice/v4 v4.0.6 h1:jmM9HwI9lfetQV/39uD0nY4y++XZNPhvzIPCb8EwxUM= -github.com/pion/ice/v4 v4.0.6/go.mod h1:y3M18aPhIxLlcO/4dn9X8LzLLSma84cx6emMSu14FGw= -github.com/pion/interceptor v0.1.37 h1:aRA8Zpab/wE7/c0O3fh1PqY0AJI3fCSEM5lRWJVorwI= -github.com/pion/interceptor v0.1.37/go.mod h1:JzxbJ4umVTlZAf+/utHzNesY8tmRkM2lVmkS82TTj8Y= -github.com/pion/logging v0.2.3 h1:gHuf0zpoh1GW67Nr6Gj4cv5Z9ZscU7g/EaoC/Ke/igI= -github.com/pion/logging v0.2.3/go.mod h1:z8YfknkquMe1csOrxK5kc+5/ZPAzMxbKLX5aXpbpC90= -github.com/pion/mdns v0.0.12 h1:CiMYlY+O0azojWDmxdNr7ADGrnZ+V6Ilfner+6mSVK8= -github.com/pion/mdns v0.0.12/go.mod h1:VExJjv8to/6Wqm1FXK+Ii/Z9tsVk/F5sD/N70cnYFbk= -github.com/pion/mdns/v2 v2.0.7 h1:c9kM8ewCgjslaAmicYMFQIde2H9/lrZpjBkN8VwoVtM= -github.com/pion/mdns/v2 v2.0.7/go.mod h1:vAdSYNAT0Jy3Ru0zl2YiW3Rm/fJCwIeM0nToenfOJKA= -github.com/pion/randutil v0.1.0 h1:CFG1UdESneORglEsnimhUjf33Rwjubwj6xfiOXBa3mA= -github.com/pion/randutil v0.1.0/go.mod h1:XcJrSMMbbMRhASFVOlj/5hQial/Y8oH/HVo7TBZq+j8= -github.com/pion/rtcp v1.2.15 h1:LZQi2JbdipLOj4eBjK4wlVoQWfrZbh3Q6eHtWtJBZBo= -github.com/pion/rtcp v1.2.15/go.mod h1:jlGuAjHMEXwMUHK78RgX0UmEJFV4zUKOFHR7OP+D3D0= -github.com/pion/rtp v1.8.11 h1:17xjnY5WO5hgO6SD3/NTIUPvSFw/PbLsIJyz1r1yNIk= -github.com/pion/rtp v1.8.11/go.mod h1:8uMBJj32Pa1wwx8Fuv/AsFhn8jsgw+3rUC2PfoBZ8p4= -github.com/pion/sctp v1.8.35 h1:qwtKvNK1Wc5tHMIYgTDJhfZk7vATGVHhXbUDfHbYwzA= -github.com/pion/sctp v1.8.35/go.mod h1:EcXP8zCYVTRy3W9xtOF7wJm1L1aXfKRQzaM33SjQlzg= -github.com/pion/sdp/v3 v3.0.10 h1:6MChLE/1xYB+CjumMw+gZ9ufp2DPApuVSnDT8t5MIgA= -github.com/pion/sdp/v3 v3.0.10/go.mod h1:88GMahN5xnScv1hIMTqLdu/cOcUkj6a9ytbncwMCq2E= -github.com/pion/srtp/v3 v3.0.4 h1:2Z6vDVxzrX3UHEgrUyIGM4rRouoC7v+NiF1IHtp9B5M= -github.com/pion/srtp/v3 v3.0.4/go.mod h1:1Jx3FwDoxpRaTh1oRV8A/6G1BnFL+QI82eK4ms8EEJQ= -github.com/pion/stun v0.6.1 h1:8lp6YejULeHBF8NmV8e2787BogQhduZugh5PdhDyyN4= -github.com/pion/stun v0.6.1/go.mod h1:/hO7APkX4hZKu/D0f2lHzNyvdkTGtIy3NDmLR7kSz/8= -github.com/pion/stun/v3 v3.0.0 h1:4h1gwhWLWuZWOJIJR9s2ferRO+W3zA/b6ijOI6mKzUw= -github.com/pion/stun/v3 v3.0.0/go.mod h1:HvCN8txt8mwi4FBvS3EmDghW6aQJ24T+y+1TKjB5jyU= -github.com/pion/transport/v2 v2.2.10 h1:ucLBLE8nuxiHfvkFKnkDQRYWYfp8ejf4YBOPfaQpw6Q= -github.com/pion/transport/v2 v2.2.10/go.mod h1:sq1kSLWs+cHW9E+2fJP95QudkzbK7wscs8yYgQToO5E= -github.com/pion/transport/v3 v3.0.7 h1:iRbMH05BzSNwhILHoBoAPxoB9xQgOaJk+591KC9P1o0= -github.com/pion/transport/v3 v3.0.7/go.mod h1:YleKiTZ4vqNxVwh77Z0zytYi7rXHl7j6uPLGhhz9rwo= -github.com/pion/turn/v2 v2.1.6 h1:Xr2niVsiPTB0FPtt+yAWKFUkU1eotQbGgpTIld4x1Gc= -github.com/pion/turn/v2 v2.1.6/go.mod h1:huEpByKKHix2/b9kmTAM3YoX6MKP+/D//0ClgUYR2fY= -github.com/pion/turn/v4 v4.0.0 h1:qxplo3Rxa9Yg1xXDxxH8xaqcyGUtbHYw4QSCvmFWvhM= -github.com/pion/turn/v4 v4.0.0/go.mod h1:MuPDkm15nYSklKpN8vWJ9W2M0PlyQZqYt1McGuxG7mA= -github.com/pion/webrtc/v4 v4.0.8 h1:T1ZmnT9qxIJIt4d8XoiMOBrTClGHDDXNg9e/fh018Qc= -github.com/pion/webrtc/v4 v4.0.8/go.mod h1:HHBeUVBAC+j4ZFnYhovEFStF02Arb1EyD4G7e7HBTJw= -github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= @@ -272,14 +98,6 @@ github.com/prometheus/common v0.65.0 h1:QDwzd+G1twt//Kwj/Ww6E9FQq1iVMmODnILtW1t2 github.com/prometheus/common v0.65.0/go.mod h1:0gZns+BLRQ3V6NdaerOhMbwwRbNh9hkGINtQAsP5GS8= github.com/prometheus/procfs v0.17.0 h1:FuLQ+05u4ZI+SS/w9+BWEM2TXiHKsUQ9TADiRH7DuK0= github.com/prometheus/procfs v0.17.0/go.mod h1:oPQLaDAMRbA+u8H5Pbfq+dl3VDAvHxMUOVhe0wYB2zw= -github.com/quic-go/qpack v0.5.1 h1:giqksBPnT/HDtZ6VhtFKgoLOWmlyo9Ei6u9PqzIMbhI= -github.com/quic-go/qpack v0.5.1/go.mod h1:+PC4XFrEskIVkcLzpEkbLqq1uCoxPhQuvK5rH1ZgaEg= -github.com/quic-go/quic-go v0.49.0 h1:w5iJHXwHxs1QxyBv1EHKuC50GX5to8mJAxvtnttJp94= -github.com/quic-go/quic-go v0.49.0/go.mod h1:s2wDnmCdooUQBmQfpUSTCYBl1/D4FcqbULMMkASvR6s= -github.com/quic-go/webtransport-go v0.8.1-0.20241018022711-4ac2c9250e66 h1:4WFk6u3sOT6pLa1kQ50ZVdm8BQFgJNA117cepZxtLIg= -github.com/quic-go/webtransport-go v0.8.1-0.20241018022711-4ac2c9250e66/go.mod h1:Vp72IJajgeOL6ddqrAhmp7IM9zbTcgkQxD/YdxrVwMw= -github.com/raulk/go-watchdog v1.3.0 h1:oUmdlHxdkXRJlwfG0O9omj8ukerm8MEQavSiDTEtBsk= -github.com/raulk/go-watchdog v1.3.0/go.mod h1:fIvOnLbF0b0ZwkB9YU4mOW9Did//4vPZtDqv66NfsMU= github.com/rogpeppe/go-internal v1.11.0 h1:cWPaGQEPrBb5/AsnsZesgZZ9yb1OQ+GOISoDNXVBh4M= github.com/rogpeppe/go-internal v1.11.0/go.mod h1:ddIwULY96R17DhadqLgMfk9H9tvdUzkipdSkR5nkCZA= github.com/rs/xid v1.6.0/go.mod h1:7XoLgs4eV+QndskICGsho+ADou8ySMSjJKDIan90Nz0= @@ -294,15 +112,10 @@ github.com/smartystreets/assertions v1.2.0/go.mod h1:tcbTF8ujkAEcZ8TElKY+i30BzYl github.com/smartystreets/goconvey v0.0.0-20190731233626-505e41936337/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= github.com/smartystreets/goconvey v1.7.2 h1:9RBaZCeXEQ3UselpuwUQHltGVXvdwm6cv1hgR6gDIPg= github.com/smartystreets/goconvey v1.7.2/go.mod h1:Vw0tHAZW6lzCRk3xgdin6fKYcG+G3Pg9vgXWeJpQFMM= -github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI= -github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= -github.com/wlynxg/anet v0.0.5 h1:J3VJGi1gvo0JwZ/P1/Yc/8p63SoW98B5dHkYDmpgvvU= -github.com/wlynxg/anet v0.0.5/go.mod h1:eay5PRQr7fIVAMbTbchTnO9gG65Hg/uYGdc7mguHxoA= github.com/xdg-go/pbkdf2 v1.0.0 h1:Su7DPu48wXMwC3bs7MCNG+z4FhcyEuz5dlvchbq0B0c= github.com/xdg-go/pbkdf2 v1.0.0/go.mod h1:jrpuAogTd400dnrH08LKmI/xc1MbPOebTwRqcT5RDeI= github.com/xdg-go/scram v1.1.2 h1:FHX5I5B4i4hKRVRBCFRxq1iQRej7WO3hhBuJf+UUySY= @@ -311,71 +124,31 @@ github.com/xdg-go/stringprep v1.0.4 h1:XLI/Ng3O1Atzq0oBs3TWm+5ZVgkq2aqdlvP9JtoZ6 github.com/xdg-go/stringprep v1.0.4/go.mod h1:mPGuuIYwz7CmR2bT9j4GbQqutWS1zV24gijq1dTyGkM= github.com/youmark/pkcs8 v0.0.0-20240726163527-a2c0da244d78 h1:ilQV1hzziu+LLM3zUTJ0trRztfwgjqKnBWNtSRkbmwM= github.com/youmark/pkcs8 v0.0.0-20240726163527-a2c0da244d78/go.mod h1:aL8wCCfTfSfmXjznFBSZNN13rSJjlIOI1fUNAtF7rmI= -github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= go.mongodb.org/mongo-driver v1.17.4 h1:jUorfmVzljjr0FLzYQsGP8cgN/qzzxlY9Vh0C9KFXVw= go.mongodb.org/mongo-driver v1.17.4/go.mod h1:Hy04i7O2kC4RS06ZrhPRqj/u4DTYkFDAAccj+rVKqgQ= -go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= -go.uber.org/dig v1.18.0 h1:imUL1UiY0Mg4bqbFfsRQO5G4CGRBec/ZujWTvSVp3pw= -go.uber.org/dig v1.18.0/go.mod h1:Us0rSJiThwCv2GteUN0Q7OKvU7n5J4dxZ9JKUXozFdE= -go.uber.org/fx v1.23.0 h1:lIr/gYWQGfTwGcSXWXu4vP5Ws6iqnNEIY+F/aFzCKTg= -go.uber.org/fx v1.23.0/go.mod h1:o/D9n+2mLP6v1EG+qsdT1O8wKopYAsqZasju97SDFCU= -go.uber.org/goleak v1.1.11-0.20210813005559-691160354723/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= -go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= -go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= -go.uber.org/mock v0.5.0 h1:KAMbZvZPyBPWgD14IrIQ38QCyjwpvVVV6K/bHl1IwQU= -go.uber.org/mock v0.5.0/go.mod h1:ge71pBPLYDk7QIi1LupWxdAykm7KIEFchiOqd6z7qMM= -go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= -go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= -go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= -go.uber.org/zap v1.19.1/go.mod h1:j3DNczoxDZroyBnOT1L/Q79cfUMGZxlv/9dzN7SM1rI= -go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8= -go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191112222119-e1110fd1c708/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.39.0 h1:SHs+kF4LP+f+p14esP5jAoDpHU8Gu/v9lFRK6IT5imM= golang.org/x/crypto v0.39.0/go.mod h1:L+Xg3Wf6HoL4Bn4238Z6ft6KfEpN0tJGo53AAPC632U= -golang.org/x/exp v0.0.0-20250128182459-e0ece0dbea4c h1:KL/ZBHXgKGVmuZBZ01Lt57yE5ws8ZPSkkihmEyq7FXc= -golang.org/x/exp v0.0.0-20250128182459-e0ece0dbea4c/go.mod h1:tujkw807nyEEAamNbDrEGzRav+ilXA7PCRAd6xsmwiU= -golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= -golang.org/x/mod v0.25.0 h1:n7a+ZbQKQA/Ysbyb0/6IbB1H/X41mKgbhfv7AfG/44w= -golang.org/x/mod v0.25.0/go.mod h1:IXM97Txy2VM4PJ3gI61r1YEk/gAj6zAHN3AdZt6S9Ww= golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.41.0 h1:vBTly1HeNPEn3wtREYfy4GZ/NECgw2Cnl+nK6Nz3uvw= golang.org/x/net v0.41.0/go.mod h1:B/K4NNqkfmg07DQYrbwvSluqCJOOXwUjeb/5lOisjbA= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.15.0 h1:KWH3jNZsfyT6xfAfKiz6MRNmd46ByHDYaZ7KSkCtdW8= golang.org/x/sync v0.15.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191115151921-52ab43148777/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -392,31 +165,16 @@ golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= golang.org/x/text v0.26.0 h1:P42AVeLghgTYr4+xUnTRKDMqpar+PtX7KWuNQL21L8M= golang.org/x/text v0.26.0/go.mod h1:QK15LZJUUQVJxhz7wXgxSy/CJaTFjd0G+YLonydOVQA= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= -golang.org/x/tools v0.33.0 h1:4qz2S3zmRxbGIhDIAgjxvFutSvH5EfnsYrRBj0UI0bc= -golang.org/x/tools v0.33.0/go.mod h1:CIJMaWEY88juyUfo7UbgPqbC8rU2OqfAV1h2Qp0oMYI= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= google.golang.org/protobuf v1.36.6 h1:z1NpPI8ku2WgiWnf+t9wTPsn6eP1L7ksHUlkfLvd9xY= google.golang.org/protobuf v1.36.6/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -lukechampine.com/blake3 v1.3.0 h1:sJ3XhFINmHSrYCgl958hscfIa3bw8x4DqMP3u1YvoYE= -lukechampine.com/blake3 v1.3.0/go.mod h1:0OFRp7fBtAylGVCO40o87sbupkyIGgbpv1+M1k1LM6k= diff --git a/infrastructure/nats.go b/infrastructure/nats.go new file mode 100644 index 0000000..6635da8 --- /dev/null +++ b/infrastructure/nats.go @@ -0,0 +1,62 @@ +package infrastructure + +import ( + "encoding/json" + "fmt" + + oclib "cloud.o-forge.io/core/oc-lib" + "cloud.o-forge.io/core/oc-lib/models/resources" + "cloud.o-forge.io/core/oc-lib/tools" +) + +var SearchStream = map[string]chan resources.ResourceInterface{} + +func EmitNATS(message tools.PropalgationMessage) { + b, _ := json.Marshal(message) + if message.Action == tools.PB_SEARCH { + SearchStream[message.User] = make(chan resources.ResourceInterface, 128) + } + tools.NewNATSCaller().SetNATSPub(tools.PROPALGATION_EVENT, tools.NATSResponse{ + FromApp: "oc-catalog", + Datatype: -1, + Method: int(tools.PROPALGATION_EVENT), + Payload: b, + }) +} + +func ListenNATS() { + tools.NewNATSCaller().ListenNats(map[tools.NATSMethod]func(tools.NATSResponse){ + tools.CATALOG_SEARCH_EVENT: func(resp tools.NATSResponse) { + p := map[string]interface{}{} + err := json.Unmarshal(resp.Payload, &p) + if err == nil { + access := oclib.NewRequestAdmin(oclib.LibDataEnum(resp.Datatype), nil) + if data := access.LoadOne(fmt.Sprintf("%v", p["id"])); data.Data != nil { + access.UpdateOne(p, fmt.Sprintf("%v", p["id"])) + } else { + access.StoreOne(p) + } + } + }, + tools.CREATE_RESOURCE: func(resp tools.NATSResponse) { + p := map[string]interface{}{} + err := json.Unmarshal(resp.Payload, &p) + if err == nil { + access := oclib.NewRequestAdmin(oclib.LibDataEnum(resp.Datatype), nil) + if data := access.LoadOne(fmt.Sprintf("%v", p["id"])); data.Data != nil { + access.UpdateOne(p, fmt.Sprintf("%v", p["id"])) + } else { + access.StoreOne(p) + } + } + }, + tools.REMOVE_RESOURCE: func(resp tools.NATSResponse) { + p := map[string]interface{}{} + access := oclib.NewRequestAdmin(oclib.LibDataEnum(resp.Datatype), nil) + err := json.Unmarshal(resp.Payload, &p) + if err == nil { + access.DeleteOne(fmt.Sprintf("%v", p["id"])) + } + }, + }) +} diff --git a/infrastructure/publish.go b/infrastructure/publish.go deleted file mode 100644 index 8acc90c..0000000 --- a/infrastructure/publish.go +++ /dev/null @@ -1,245 +0,0 @@ -package infrastructure - -import ( - "context" - "encoding/json" - "errors" - "time" - - oclib "cloud.o-forge.io/core/oc-lib" - "cloud.o-forge.io/core/oc-lib/dbs" - "cloud.o-forge.io/core/oc-lib/models/peer" - "cloud.o-forge.io/core/oc-lib/models/resources" - "cloud.o-forge.io/core/oc-lib/tools" -) - -func (ps *PubSubService) searchResponsePublishEvent( - ctx context.Context, - dt *tools.DataType, - user string, - peerID string, - payload []byte, -) error { - return ps.publishEvent(ctx, dt, SEARCH_RESPONSE, user, peerID, payload, true) -} - -func (ps *PubSubService) SearchPublishEvent( - ctx context.Context, - dt *tools.DataType, - typ string, - user string, - search string, -) error { - switch typ { - case "partner": - ps.searchPartnersPublishEvent( - ctx, dt, user, search, - ) - case "all": - b, err := json.Marshal(map[string]string{ - "search": search, - }) - if err != nil { - return err - } - ps.searchPublishEvent( - ctx, dt, user, "", b, - ) - case "known": - ps.searchKnownPublishEvent( - ctx, dt, user, search, - ) - default: - return errors.New("no type of research found") - } - return nil -} - -func (ps *PubSubService) searchPartnersPublishEvent( - ctx context.Context, - dt *tools.DataType, - user string, - search string, -) error { - access := oclib.NewRequestAdmin(oclib.LibDataEnum(oclib.PEER), "", "", []string{}, nil) - f := &dbs.Filters{ - And: map[string][]dbs.Filter{ // search by name if no filters are provided - "state": {{Operator: dbs.EQUAL.String(), Value: peer.ONLINE.EnumIndex()}}, - "relation": {{Operator: dbs.EQUAL.String(), Value: peer.PARTNER.EnumIndex()}}, - }, - } - if search != "" { - f.Or = map[string][]dbs.Filter{ // filter by like name, short_description, description, owner, url if no filters are provided - "abstractintanciatedresource.abstractresource.abstractobject.name": {{Operator: dbs.LIKE.String(), Value: search}}, - "abstractintanciatedresource.abstractresource.type": {{Operator: dbs.LIKE.String(), Value: search}}, - "abstractintanciatedresource.abstractresource.short_description": {{Operator: dbs.LIKE.String(), Value: search}}, - "abstractintanciatedresource.abstractresource.description": {{Operator: dbs.LIKE.String(), Value: search}}, - "abstractintanciatedresource.abstractresource.owners.name": {{Operator: dbs.LIKE.String(), Value: search}}, - "abstractintanciatedresource.abstractresource.abstractobject.creator_id": {{Operator: dbs.EQUAL.String(), Value: search}}, - } - } - b, err := json.Marshal(map[string]string{ - "search": search, - }) - if err != nil { - return err - } - peersKnown := access.Search(f, "", false) - for _, known := range peersKnown.Data { - if err := ps.searchPublishEvent(ctx, dt, user, known.GetID(), b); err != nil { - return err - } - } - return nil -} - -func (ps *PubSubService) searchKnownPublishEvent( - ctx context.Context, - dt *tools.DataType, - user string, - search string, -) error { - access := oclib.NewRequestAdmin(oclib.LibDataEnum(oclib.PEER), "", "", []string{}, nil) - f := &dbs.Filters{ - And: map[string][]dbs.Filter{ // search by name if no filters are provided - "state": {{Operator: dbs.EQUAL.String(), Value: peer.ONLINE.EnumIndex()}}, - "relation": {{Operator: dbs.NOT.String(), Value: &dbs.Filters{ - And: map[string][]dbs.Filter{ - "relation": {{Operator: dbs.EQUAL.String(), Value: peer.BLACKLIST.EnumIndex()}}, - }, - }}}, - }, - } - if search != "" { - f.Or = map[string][]dbs.Filter{ // filter by like name, short_description, description, owner, url if no filters are provided - "abstractintanciatedresource.abstractresource.abstractobject.name": {{Operator: dbs.LIKE.String(), Value: search}}, - "abstractintanciatedresource.abstractresource.type": {{Operator: dbs.LIKE.String(), Value: search}}, - "abstractintanciatedresource.abstractresource.short_description": {{Operator: dbs.LIKE.String(), Value: search}}, - "abstractintanciatedresource.abstractresource.description": {{Operator: dbs.LIKE.String(), Value: search}}, - "abstractintanciatedresource.abstractresource.owners.name": {{Operator: dbs.LIKE.String(), Value: search}}, - "abstractintanciatedresource.abstractresource.abstractobject.creator_id": {{Operator: dbs.EQUAL.String(), Value: search}}, - } - } - b, err := json.Marshal(map[string]string{ - "search": search, - }) - if err != nil { - return err - } - peersKnown := access.Search(f, "", false) - for _, known := range peersKnown.Data { - if err := ps.searchPublishEvent(ctx, dt, user, known.GetID(), b); err != nil { - return err - } - } - return nil -} - -func (ps *PubSubService) searchPublishEvent( - ctx context.Context, - dt *tools.DataType, - user string, - peerID string, - payload []byte, -) error { - id, err := oclib.GenerateNodeID() - if err != nil { - return err - } - ps.SearchStream[user] = make(chan resources.ResourceInterface, 128) // set up the searchStream - if err := ps.subscribeEvents(ctx, dt, SEARCH_RESPONSE, id, 60); err != nil { // TODO Catpure Event ! - return err - } - return ps.publishEvent(ctx, dt, SEARCH, user, peerID, payload, false) -} - -func (ps *PubSubService) CreatePublishEvent( - ctx context.Context, - dt *tools.DataType, - user string, - payload []byte, -) error { - id, err := oclib.GenerateNodeID() - if err != nil { - return err - } - return ps.publishEvent(ctx, dt, CREATE, user, id, payload, false) -} - -func (ps *PubSubService) UpdatePublishEvent( - ctx context.Context, - dt *tools.DataType, - user string, - payload []byte, -) error { - id, err := oclib.GenerateNodeID() - if err != nil { - return err - } - return ps.publishEvent(ctx, dt, UPDATE, user, id, payload, false) -} - -func (ps *PubSubService) DeletePublishEvent( - ctx context.Context, - dt *tools.DataType, - user string, - payload []byte, -) error { - id, err := oclib.GenerateNodeID() - if err != nil { - return err - } - return ps.publishEvent(ctx, dt, DELETE, user, id, payload, false) -} - -func (ps *PubSubService) publishEvent( - ctx context.Context, - dt *tools.DataType, - action PubSubAction, - user string, - peerID string, - payload []byte, - chanNamedByDt bool, -) error { - name := "oc-catalog." + action.String() + "#" + peerID - if chanNamedByDt && dt != nil { // if a datatype is precised then : app.action.datatype#peerID - name = "oc-catalog." + action.String() + "." + (*dt).String() + "#" + peerID - } - - from, err := oclib.GenerateNodeID() - if err != nil { - return err - } - evt := Event{ - Type: name, - From: from, - User: user, - Timestamp: time.Now().Unix(), - Payload: payload, - } - if dt != nil { - evt.DataType = int64(dt.EnumIndex()) - } else { - evt.DataType = -1 - } - - body, _ := json.Marshal(evt) - priv, err := LoadKeyFromFile(false) - if err != nil { - return err - } - sig, _ := priv.Sign(body) - evt.Signature = sig - - msg, _ := json.Marshal(evt) - - topic, err := ps.PS.Join(name) - if err != nil { - return err - } - - return topic.Publish(ctx, msg) -} - -// TODO REVIEW PUBLISHING + ADD SEARCH ON PUBLIC : YES -// TODO : Search should verify DataType diff --git a/infrastructure/pubsub.go b/infrastructure/pubsub.go deleted file mode 100644 index e0e4f46..0000000 --- a/infrastructure/pubsub.go +++ /dev/null @@ -1,346 +0,0 @@ -package infrastructure - -import ( - "context" - "encoding/json" - "errors" - "strings" - "sync" - "time" - - oclib "cloud.o-forge.io/core/oc-lib" - "cloud.o-forge.io/core/oc-lib/dbs" - "cloud.o-forge.io/core/oc-lib/models/resources" - "cloud.o-forge.io/core/oc-lib/tools" - pubsub "github.com/libp2p/go-libp2p-pubsub" - "github.com/rs/zerolog" -) - -type PubSubAction int - -const ( - SEARCH PubSubAction = iota - SEARCH_RESPONSE - CREATE - UPDATE - DELETE - NONE -) - -func GetActionString(ss string) PubSubAction { - switch ss { - case "search": - return SEARCH - case "create": - return CREATE - case "update": - return UPDATE - case "delete": - return DELETE - default: - return NONE - } -} - -var path = []string{"search", "create", "update", "delete"} - -func (m PubSubAction) String() string { - return strings.ToUpper(path[m]) -} - -type PubSubService struct { - PS *pubsub.PubSub - Subscription []string - mutex sync.RWMutex - SearchStream map[string]chan resources.ResourceInterface -} - -var Singleton *PubSubService - -type Event struct { - Type string `json:"type"` - From string `json:"from"` // peerID - - User string - - DataType int64 `json:"datatype"` - Timestamp int64 `json:"ts"` - Payload []byte `json:"payload"` - Signature []byte `json:"sig"` -} - -func (e *Event) rawEvent() *Event { - return &Event{ - Type: e.Type, - From: e.From, - User: e.User, - DataType: e.DataType, - Timestamp: e.Timestamp, - Payload: e.Payload, - } -} - -func (ps *PubSubService) handleEvent(ctx context.Context, topicName string, evt Event) error { - action := ps.getTopicName(topicName) - if err := ps.handleEventFromPartner(topicName, action, evt); err != nil { - return err - } - if err := ps.eventSearch(ctx, evt, action); err != nil { - return err - } - return nil -} - -func (ps *PubSubService) getTopicName( - topicName string) PubSubAction { - if !strings.Contains(topicName, "catalog.") { - return NONE - } - n := strings.ReplaceAll(topicName, "catalog.", "") - ns := strings.Split(n, ".") - - if len(ns) > 0 { - return GetActionString(ns[0]) - } - return NONE -} - -func (ps *PubSubService) eventSearch( // only : on partner followings. 3 canals for every partner. - ctx context.Context, - evt Event, - action PubSubAction, -) error { - var data oclib.LibData - logger := oclib.GetLogger() - switch action { - case SEARCH_RESPONSE: - access := oclib.NewRequestAdmin(oclib.LibDataEnum(oclib.PEER), "", "", []string{}, nil) - peers := access.Search(nil, evt.From, false) - if len(peers.Data) > 0 { - if err := ps.retrieveResponse(ctx, peers, evt, logger); err != nil { - return err - } - } else { - access = oclib.NewRequestAdmin(oclib.LibDataEnum(oclib.PEER), "", "", []string{}, nil) - tools.NewNATSCaller().SetNATSPub(tools.PEER_DISCOVERY, map[string]string{ - "peer_id": evt.From, // peerside - }) - time.Sleep(30 * time.Second) - peers = access.Search(nil, evt.From, false) - if len(peers.Data) > 0 { // if found... ok... if not found ignore - if err := ps.retrieveResponse(ctx, peers, evt, logger); err != nil { - return err - } - } - } - case SEARCH: // when someone ask for search. - access := oclib.NewRequestAdmin(oclib.LibDataEnum(oclib.PEER), "", "", []string{}, nil) - peers := access.Search(nil, evt.From, false) - if len(peers.Data) > 0 { - if err := ps.sendResponse(ctx, peers, evt); err != nil { - return err - } - } else { - access = oclib.NewRequestAdmin(oclib.LibDataEnum(oclib.PEER), "", "", []string{}, nil) - tools.NewNATSCaller().SetNATSPub(tools.PEER_DISCOVERY, map[string]string{ - "peer_id": evt.From, // peerside - }) - time.Sleep(30 * time.Second) - peers = access.Search(nil, evt.From, false) - if len(peers.Data) > 0 { // if found... ok... if not found ignore - if err := ps.sendResponse(ctx, peers, evt); err != nil { - return err - } - } - } - default: - return nil - } - if data.Err != "" { - return errors.New(data.Err) - } - return nil -} - -// TODO i should KNOW WHO IS ASKING !!! -func (abs *PubSubService) retrieveResponse(ctx context.Context, peers oclib.LibDataShallow, event Event, logger zerolog.Logger) error { - if err := abs.verifyPeer(peers, event); err != nil { - return err - } - res, err := abs.toResource(int(event.DataType), event.Payload) - if err != nil || res == nil { - return nil - } - access := oclib.NewRequestAdmin(oclib.LibDataEnum(event.DataType), "", "", []string{}, nil) - if data := access.LoadOne(res.GetID()); data.Data != nil && data.Err == "" { - if newData := access.UpdateOne(res.Serialize(res), res.GetID()); newData.Err != "" { - return errors.New(newData.Err) - } - } else { - if newData := access.StoreOne(res.Serialize(res)); newData.Err != "" { - return errors.New(newData.Err) - } - } - if abs.SearchStream[event.User] == nil { - ctx.Done() - return errors.New("no stream opened for user " + event.User) - } - select { - case abs.SearchStream[event.User] <- res: - case <-ctx.Done(): - return errors.New("client too slow") - } - return nil -} - -func (abs *PubSubService) sendResponse(ctx context.Context, peers oclib.LibDataShallow, event Event) error { - if err := abs.verifyPeer(peers, event); err != nil { - return err - } - dts := []oclib.LibDataEnum{oclib.LibDataEnum(event.DataType)} - if event.DataType == -1 { // expect all resources - dts = []oclib.LibDataEnum{oclib.LibDataEnum(oclib.COMPUTE_RESOURCE), oclib.LibDataEnum(oclib.STORAGE_RESOURCE), - oclib.LibDataEnum(oclib.PROCESSING_RESOURCE), oclib.LibDataEnum(oclib.DATA_RESOURCE), oclib.LibDataEnum(oclib.WORKFLOW_RESOURCE)} - } - var m map[string]string - err := json.Unmarshal(event.Payload, &m) - if err != nil { - return err - } - for _, dt := range dts { - access := oclib.NewRequestAdmin(oclib.LibDataEnum(event.DataType), "", "", []string{}, nil) - peerID := peers.Data[0].GetID() - searched := access.Search(abs.FilterPeer(peerID, m["search"]), "", false) - for _, ss := range searched.Data { - if j, err := json.Marshal(ss); err == nil { - if event.DataType != -1 { - ndt := tools.DataType(dt.EnumIndex()) - abs.searchResponsePublishEvent(ctx, &ndt, event.User, peerID, j) - } else { - abs.searchResponsePublishEvent(ctx, nil, event.User, peerID, j) - } - } - } - } - - return nil -} - -func (abs *PubSubService) FilterPeer(peerID string, search string) *dbs.Filters { - id, err := oclib.GetMySelf() - if err != nil { - return nil - } - filter := map[string][]dbs.Filter{ - "creator_id": {{Operator: dbs.EQUAL.String(), Value: id}}, // is my resource... - "": {{Operator: dbs.OR.String(), Value: &dbs.Filters{ - Or: map[string][]dbs.Filter{ - "abstractobject.access_mode": {{Operator: dbs.EQUAL.String(), Value: 1}}, // if public - "abstractinstanciatedresource.instances": {{Operator: dbs.ELEMMATCH.String(), Value: &dbs.Filters{ // or got a partners instances - And: map[string][]dbs.Filter{ - "resourceinstance.partnerships": {{Operator: dbs.ELEMMATCH.String(), Value: &dbs.Filters{ - And: map[string][]dbs.Filter{ - "resourcepartnership.peer_groups." + peerID: {{Operator: dbs.EXISTS.String(), Value: true}}, - }, - }}}, - }, - }}}, - }, - }}}, - } - if search != "" { - filter[" "] = []dbs.Filter{{Operator: dbs.OR.String(), Value: &dbs.Filters{ - Or: map[string][]dbs.Filter{ // filter by like name, short_description, description, owner, url if no filters are provided - "abstractintanciatedresource.abstractresource.abstractobject.name": {{Operator: dbs.LIKE.String(), Value: search}}, - "abstractintanciatedresource.abstractresource.type": {{Operator: dbs.LIKE.String(), Value: search}}, - "abstractintanciatedresource.abstractresource.short_description": {{Operator: dbs.LIKE.String(), Value: search}}, - "abstractintanciatedresource.abstractresource.description": {{Operator: dbs.LIKE.String(), Value: search}}, - "abstractintanciatedresource.abstractresource.owners.name": {{Operator: dbs.LIKE.String(), Value: search}}, - "abstractintanciatedresource.abstractresource.abstractobject.creator_id": {{Operator: dbs.EQUAL.String(), Value: search}}, - }, - }}} - } - return &dbs.Filters{ - And: filter, - } -} - -func (ps *PubSubService) handleEventFromPartner( - topicName string, - action PubSubAction, - evt Event) error { - if action == CREATE || action == UPDATE || action == DELETE { - return ps.eventFromPartner(evt, action) - } - - return nil -} - -func (ps *PubSubService) eventFromPartner( // only : on partner followings. 3 canals for every partner. - evt Event, - action PubSubAction, -) error { - access := oclib.NewRequestAdmin(oclib.LibDataEnum(evt.DataType), "", "", []string{}, nil) - ressource, err := ps.toResource(int(evt.DataType), evt.Payload) - if err != nil { - return err - } - var data oclib.LibData - switch action { - case CREATE: - data = access.StoreOne(ressource.Serialize(ressource)) - case UPDATE: - if data := access.LoadOne(ressource.GetID()); data.Data == nil { - data = access.StoreOne(ressource.Serialize(ressource)) - } else { - data = access.UpdateOne(ressource.Serialize(ressource), ressource.GetID()) - } - case DELETE: - data = access.DeleteOne(ressource.GetID()) - default: - return errors.New("no action authorized available : " + action.String()) - } - if data.Err != "" { - return errors.New(data.Err) - } - return nil -} - -func (ps *PubSubService) toResource( - dt int, - payload []byte, -) (resources.ResourceInterface, error) { - switch dt { - case oclib.PROCESSING_RESOURCE.EnumIndex(): - var data resources.ProcessingResource - if err := json.Unmarshal(payload, &data); err != nil { - return nil, err - } - return &data, nil - case oclib.WORKFLOW_RESOURCE.EnumIndex(): - var data resources.WorkflowResource - if err := json.Unmarshal(payload, &data); err != nil { - return nil, err - } - return &data, nil - case oclib.DATA_RESOURCE.EnumIndex(): - var data resources.DataResource - if err := json.Unmarshal(payload, &data); err != nil { - return nil, err - } - return &data, nil - case oclib.STORAGE_RESOURCE.EnumIndex(): - var data resources.StorageResource - if err := json.Unmarshal(payload, &data); err != nil { - return nil, err - } - return &data, nil - case oclib.COMPUTE_RESOURCE.EnumIndex(): - var data resources.ComputeResource - if err := json.Unmarshal(payload, &data); err != nil { - return nil, err - } - return &data, nil - } - return nil, errors.New("can't found any data resources matching") -} diff --git a/infrastructure/subscribe.go b/infrastructure/subscribe.go deleted file mode 100644 index 25904fd..0000000 --- a/infrastructure/subscribe.go +++ /dev/null @@ -1,208 +0,0 @@ -package infrastructure - -import ( - "context" - "encoding/base64" - "encoding/json" - "errors" - "fmt" - "slices" - "time" - - oclib "cloud.o-forge.io/core/oc-lib" - "cloud.o-forge.io/core/oc-lib/models/peer" - "cloud.o-forge.io/core/oc-lib/tools" - pubsub "github.com/libp2p/go-libp2p-pubsub" - "github.com/libp2p/go-libp2p/core/crypto" -) - -func (ps *PubSubService) InitSubscribeEvents(ctx context.Context) error { - ourPeerID, err := oclib.GenerateNodeID() - if err != nil { - return err - } - // subscribe : - if err := ps.subscribeEvents(ctx, nil, SEARCH, "", -1); err != nil { // we subscribe at our proprer deductible search adresse. - return err - } - if err := ps.subscribeEvents(ctx, nil, SEARCH, ourPeerID, -1); err != nil { // we subscribe at our proprer deductible search adresse. - return err - } - if err := ps.PartnersSubscribeEvents(ctx); err != nil { - return nil - } - return nil -} - -func (ps *PubSubService) SearchSubscribeEvents( - ctx context.Context, - priv crypto.PrivKey, - dt tools.DataType, - id string, - payload []byte, -) error { - return ps.subscribeEvents(ctx, &dt, CREATE, id, 10) -} - -func (ps *PubSubService) PartnersSubscribeEvents( - ctx context.Context, -) error { - access := oclib.NewRequestAdmin(oclib.LibDataEnum(oclib.PEER), "", "", []string{}, nil) - peers := access.Search(nil, fmt.Sprintf("%v", peer.PARTNER.EnumIndex()), false) - - for _, p := range peers.Data { - loadedPeer := access.LoadOne(p.GetID()) - rp := loadedPeer.ToPeer() - if rp == nil { - continue - } - if err := ps.PartnerSubscribeEvents(ctx, rp.PeerID); err != nil { - return err - } - } - return nil -} - -func (ps *PubSubService) PartnerSubscribeEvents( - ctx context.Context, - peerID string, -) error { - if peerID == "" { - return errors.New("should discover a particular peer") - } - if err := ps.subscribeEvents(ctx, nil, CREATE, peerID, -1); err != nil { - return err - } - if err := ps.subscribeEvents(ctx, nil, UPDATE, peerID, -1); err != nil { - return err - } - if err := ps.subscribeEvents(ctx, nil, DELETE, peerID, -1); err != nil { - return err - } - return nil -} - -// generic function to subscribe to DHT flow of event -func (ps *PubSubService) subscribeEvents( - ctx context.Context, - dt *tools.DataType, - action PubSubAction, - peerID string, - timeout int, -) error { - // define a name app.action#peerID - name := "oc-catalog." + action.String() + "#" + peerID - if dt != nil { // if a datatype is precised then : app.action.datatype#peerID - name = "oc-catalog." + action.String() + "." + (*dt).String() + "#" + peerID - } - topic, err := ps.PS.Join(name) // find out the topic - if err != nil { - return err - } - - sub, err := topic.Subscribe() // then subscribe to it - if err != nil { - return err - } - ps.mutex.Lock() // add safely in cache your subscription. - ps.Subscription = append(ps.Subscription, name) - ps.mutex.Unlock() - - // launch loop waiting for results. - go ps.waitResults(ctx, sub, name, timeout) - - return nil -} - -func (ps *PubSubService) waitResults(ctx context.Context, sub *pubsub.Subscription, topicName string, timeout int) { - logger := oclib.GetLogger() - defer ctx.Done() - for { - ps.mutex.Lock() // check safely if cache is actually notified subscribed to topic - if !slices.Contains(ps.Subscription, topicName) { // if not kill the loop. - break - } - ps.mutex.Unlock() - // if still subscribed -> wait for new message - var cancel context.CancelFunc - if timeout != -1 { - ctx, cancel = context.WithTimeout(ctx, time.Duration(timeout)*time.Second) - defer cancel() - } - msg, err := sub.Next(ctx) - if err != nil { - if errors.Is(err, context.DeadlineExceeded) { - // timeout hit, no message before deadline kill subsciption. - ps.mutex.Lock() - subs := []string{} - for _, ss := range ps.Subscription { - if ss != topicName { - subs = append(subs, ss) - } - } - ps.Subscription = subs - ps.mutex.Unlock() - return - } - continue - } - var evt Event - if err := json.Unmarshal(msg.Data, &evt); err != nil { // map to event - continue - } - - access := oclib.NewRequestAdmin(oclib.LibDataEnum(oclib.PEER), "", "", []string{}, nil) - peers := access.Search(nil, evt.From, false) - if len(peers.Data) > 0 { // then we check if the peer is friendly or not : Partner or None... - if err := ps.processEventPeerKnown(ctx, peers, evt, topicName); err != nil { - logger.Err(err) - } - } else { - tools.NewNATSCaller().SetNATSPub(tools.PEER_DISCOVERY, map[string]string{ - "peer_id": evt.From, - }) - time.Sleep(30 * time.Second) - peers = access.Search(nil, evt.From, false) - if len(peers.Data) > 0 { // if found... ok... if not found ignore - if err := ps.processEventPeerKnown(ctx, peers, evt, topicName); err != nil { - logger.Err(err) - } - } - } - } -} - -func (ps *PubSubService) processEventPeerKnown(ctx context.Context, peers oclib.LibDataShallow, event Event, topicName string) error { - if err := ps.verifyPeer(peers, event); err != nil { - return err - } - ps.handleEvent(ctx, topicName, event) - return nil -} - -func (pc *PubSubService) verifyPeer(peers oclib.LibDataShallow, event Event) error { - access := oclib.NewRequestAdmin(oclib.LibDataEnum(oclib.PEER), "", "", []string{}, nil) - loadedPeer := access.LoadOne(peers.Data[0].GetID()) - rp := loadedPeer.ToPeer() - if rp == nil || rp.Relation == peer.BLACKLIST { // if peer is blacklisted... quit... - return errors.New("peer is blacklisted") - } - pubKey, err := PubKeyFromString(rp.PublicKey) // extract pubkey from pubkey str - if err != nil { - return errors.New("pubkey is malformed") - } - data, _ := json.Marshal(event.rawEvent()) // extract byte from raw event excluding signature. - if ok, _ := pubKey.Verify(data, event.Signature); !ok { // then verify if pubkey sign this message... - return errors.New("check signature failed") - } - return nil -} - -func PubKeyFromString(s string) (crypto.PubKey, error) { - data, err := base64.StdEncoding.DecodeString(s) - if err != nil { - return nil, err - } - - return crypto.UnmarshalPublicKey(data) -} diff --git a/infrastructure/utils.go b/infrastructure/utils.go deleted file mode 100644 index 6b7b35b..0000000 --- a/infrastructure/utils.go +++ /dev/null @@ -1,43 +0,0 @@ -package infrastructure - -import ( - "bytes" - "oc-catalog/conf" - "os" - - "github.com/libp2p/go-libp2p/core/crypto" - "github.com/libp2p/go-libp2p/core/pnet" -) - -func LoadKeyFromFile(isPublic bool) (crypto.PrivKey, error) { - path := conf.GetConfig().PrivateKeyPath - if isPublic { - path = conf.GetConfig().PublicKeyPath - } - data, err := os.ReadFile(path) - if err != nil { - return nil, err - } - - // Try to unmarshal as libp2p private key (supports ed25519, rsa, etc.) - priv, err := crypto.UnmarshalPrivateKey(data) - if err != nil { - return nil, err - } - return priv, nil -} - -func LoadPSKFromFile() (pnet.PSK, error) { - path := conf.GetConfig().PSKPath - data, err := os.ReadFile(path) - if err != nil { - return nil, err - } - - // Try to unmarshal as libp2p private key (supports ed25519, rsa, etc.) - psk, err := pnet.DecodeV1PSK(bytes.NewReader(data)) - if err != nil { - return nil, err - } - return psk, nil -} diff --git a/main.go b/main.go index 46b847f..3f67e7f 100755 --- a/main.go +++ b/main.go @@ -1,20 +1,13 @@ package main import ( - "context" - "fmt" "oc-catalog/conf" - "oc-catalog/infrastructure" _ "oc-catalog/routers" oclib "cloud.o-forge.io/core/oc-lib" - "cloud.o-forge.io/core/oc-lib/models/resources" "cloud.o-forge.io/core/oc-lib/tools" beego "github.com/beego/beego/v2/server/web" "github.com/beego/beego/v2/server/web/filter/cors" - "github.com/libp2p/go-libp2p" - pubsub "github.com/libp2p/go-libp2p-pubsub" - "github.com/libp2p/go-libp2p/core/peer" ) const appname = "oc-catalog" @@ -53,58 +46,7 @@ func main() { ExposeHeaders: []string{"Content-Length", "Content-Type"}, AllowCredentials: true, })) - InitDTH() - infrastructure.Singleton.InitSubscribeEvents(context.Background()) beego.Run() } -func InitDTH() error { - priv, err := infrastructure.LoadKeyFromFile(false) - if err != nil { - return err - } - - psk, err := infrastructure.LoadPSKFromFile() - if err != nil { - return err - } - - h, err := libp2p.New( - libp2p.PrivateNetwork(psk), - libp2p.Identity(priv), - libp2p.ListenAddrStrings( - fmt.Sprintf("/ip4/0.0.0.0/tcp/%d", conf.GetConfig().DHTEndpointPort), - ), - ) - if err != nil { - return err - } - pi, err := peer.AddrInfoFromString(conf.GetConfig().BootstrapAddress) - if err != nil { - return err - } - logger := oclib.GetLogger() - if err := h.Connect(context.Background(), *pi); err != nil { - logger.Err(fmt.Errorf("Failed to connect to MAIN bootstrap peer %s: %s", pi.ID, err)) - } else { - logger.Info().Msg(fmt.Sprintf("Connected to MAIN bootstrap peer %s", pi.ID)) - } - - ps, err := pubsub.NewGossipSub(context.Background(), h, - pubsub.WithMessageSigning(true), - pubsub.WithStrictSignatureVerification(true), - ) - if err != nil { - return err - } - - infrastructure.Singleton = &infrastructure.PubSubService{ - PS: ps, - Subscription: []string{}, - SearchStream: make(map[string]chan resources.ResourceInterface), - // mutex field is ready without explicit literal - } - return nil -} - // TODO VERIFY IF LOOP OF GET VALUE is ENOUGH TO REFRESH