From cf5f0910b578444741b27c087ec575e677932182 Mon Sep 17 00:00:00 2001 From: 1998-felix Date: Tue, 16 Apr 2024 15:46:32 +0300 Subject: [PATCH 01/14] Migrate gocoap to v3 Signed-off-by: 1998-felix --- coap/api/transport.go | 59 +++++++++++++--------- coap/client.go | 42 ++++++++-------- go.mod | 7 ++- go.sum | 96 +++--------------------------------- internal/server/coap/coap.go | 4 +- 5 files changed, 66 insertions(+), 142 deletions(-) diff --git a/coap/api/transport.go b/coap/api/transport.go index 64d8fabb44..417c24255f 100644 --- a/coap/api/transport.go +++ b/coap/api/transport.go @@ -4,6 +4,7 @@ package api import ( + "bytes" "context" "fmt" "io" @@ -20,9 +21,9 @@ import ( svcerr "github.com/absmach/magistrala/pkg/errors/service" "github.com/absmach/magistrala/pkg/messaging" "github.com/go-chi/chi/v5" - "github.com/plgd-dev/go-coap/v2/message" - "github.com/plgd-dev/go-coap/v2/message/codes" - "github.com/plgd-dev/go-coap/v2/mux" + "github.com/plgd-dev/go-coap/v3/message" + "github.com/plgd-dev/go-coap/v3/message/codes" + "github.com/plgd-dev/go-coap/v3/mux" "github.com/prometheus/client_golang/prometheus/promhttp" ) @@ -66,20 +67,28 @@ func MakeCoAPHandler(svc coap.Service, l *slog.Logger) mux.HandlerFunc { return handler } -func sendResp(w mux.ResponseWriter, resp *message.Message) { - if err := w.Client().WriteMessage(resp); err != nil { - logger.Warn(fmt.Sprintf("Can't set response: %s", err)) +func sendResp(w mux.ResponseWriter, resp *message.Message, isObs bool) { + pm := w.Conn().AcquireMessage(w.Conn().Context()) + defer w.Conn().ReleaseMessage(pm) + pm.SetCode(resp.Code) + pm.SetToken(resp.Token) + pm.SetBody(bytes.NewReader(resp.Payload)) + for _, opt := range resp.Options { + pm.SetOptionBytes(opt.ID, opt.Value) + } + if !isObs { + if err := w.Conn().WriteMessage(pm); err != nil { + logger.Warn(fmt.Sprintf("Can't set response: %s", err)) + } } } func handler(w mux.ResponseWriter, m *mux.Message) { resp := message.Message{ Code: codes.Content, - Token: m.Token, - Context: m.Context, + Token: m.Token(), Options: make(message.Options, 0, 16), } - defer sendResp(w, &resp) msg, err := decodeMessage(m) if err != nil { logger.Warn(fmt.Sprintf("Error decoding message: %s", err)) @@ -92,15 +101,17 @@ func handler(w mux.ResponseWriter, m *mux.Message) { resp.Code = codes.Unauthorized return } - switch m.Code { + var isObs bool = false + switch m.Code() { case codes.GET: - err = handleGet(m.Context, m, w.Client(), msg, key) + isObs, err = handleGet(context.Background(), m, w, msg, key) case codes.POST: resp.Code = codes.Created - err = service.Publish(m.Context, key, msg) + err = nil default: err = svcerr.ErrNotFound } + defer sendResp(w, &resp, isObs) if err != nil { switch { case err == errBadOptions: @@ -116,25 +127,25 @@ func handler(w mux.ResponseWriter, m *mux.Message) { } } -func handleGet(ctx context.Context, m *mux.Message, c mux.Client, msg *messaging.Message, key string) error { +func handleGet(ctx context.Context, m *mux.Message, c mux.ResponseWriter, msg *messaging.Message, key string) (bool, error) { var obs uint32 - obs, err := m.Options.Observe() + obs, err := m.Observe() if err != nil { logger.Warn(fmt.Sprintf("Error reading observe option: %s", err)) - return errBadOptions + return false, errBadOptions } if obs == startObserve { - c := coap.NewClient(c, m.Token, logger) - return service.Subscribe(ctx, key, msg.GetChannel(), msg.GetSubtopic(), c) + c := coap.NewClient(c, m.Token(), logger) + return true, service.Subscribe(ctx, key, msg.GetChannel(), msg.GetSubtopic(), c) } - return service.Unsubscribe(ctx, key, msg.GetChannel(), msg.GetSubtopic(), m.Token.String()) + return false, service.Unsubscribe(ctx, key, msg.GetChannel(), msg.GetSubtopic(), m.Token().String()) } func decodeMessage(msg *mux.Message) (*messaging.Message, error) { - if msg.Options == nil { + if msg.Options() == nil { return &messaging.Message{}, errBadOptions } - path, err := msg.Options.Path() + path, err := msg.Path() if err != nil { return &messaging.Message{}, err } @@ -155,8 +166,8 @@ func decodeMessage(msg *mux.Message) (*messaging.Message, error) { Created: time.Now().UnixNano(), } - if msg.Body != nil { - buff, err := io.ReadAll(msg.Body) + if msg.Body() != nil { + buff, err := io.ReadAll(msg.Body()) if err != nil { return ret, err } @@ -166,10 +177,10 @@ func decodeMessage(msg *mux.Message) (*messaging.Message, error) { } func parseKey(msg *mux.Message) (string, error) { - if obs, _ := msg.Options.Observe(); obs != 0 && msg.Code == codes.GET { + if obs, _ := msg.Observe(); obs != 0 && msg.Code() == codes.GET { return "", nil } - authKey, err := msg.Options.GetString(message.URIQuery) + authKey, err := msg.Options().GetString(message.URIQuery) if err != nil { return "", err } diff --git a/coap/client.go b/coap/client.go index a71d896e56..ea8a52e17a 100644 --- a/coap/client.go +++ b/coap/client.go @@ -12,9 +12,10 @@ import ( "github.com/absmach/magistrala/pkg/errors" "github.com/absmach/magistrala/pkg/messaging" - "github.com/plgd-dev/go-coap/v2/message" - "github.com/plgd-dev/go-coap/v2/message/codes" - mux "github.com/plgd-dev/go-coap/v2/mux" + "github.com/plgd-dev/go-coap/v3/message" + "github.com/plgd-dev/go-coap/v3/message/codes" + "github.com/plgd-dev/go-coap/v3/message/pool" + mux "github.com/plgd-dev/go-coap/v3/mux" ) // Client wraps CoAP client. @@ -36,14 +37,14 @@ type Client interface { var ErrOption = errors.New("unable to set option") type client struct { - client mux.Client + client mux.ResponseWriter token message.Token observe uint32 logger *slog.Logger } // NewClient instantiates a new Observer. -func NewClient(c mux.Client, tkn message.Token, l *slog.Logger) Client { +func NewClient(c mux.ResponseWriter, tkn message.Token, l *slog.Logger) Client { return &client{ client: c, token: tkn, @@ -53,20 +54,17 @@ func NewClient(c mux.Client, tkn message.Token, l *slog.Logger) Client { } func (c *client) Done() <-chan struct{} { - return c.client.Done() + return c.client.Conn().Done() } func (c *client) Cancel() error { - m := message.Message{ - Code: codes.Content, - Token: c.token, - Context: context.Background(), - Options: make(message.Options, 0, 16), - } - if err := c.client.WriteMessage(&m); err != nil { + pm := c.client.Conn().AcquireMessage(context.Background()) + pm.SetCode(codes.Content) + pm.SetToken(c.token) + if err := c.client.Conn().WriteMessage(pm); err != nil { c.logger.Error(fmt.Sprintf("Error sending message: %s.", err)) } - return c.client.Close() + return c.client.Conn().Close() } func (c *client) Token() string { @@ -74,12 +72,10 @@ func (c *client) Token() string { } func (c *client) Handle(msg *messaging.Message) error { - m := message.Message{ - Code: codes.Content, - Token: c.token, - Context: c.client.Context(), - Body: bytes.NewReader(msg.GetPayload()), - } + pm := pool.NewMessage(context.Background()) + pm.SetCode(codes.Content) + pm.SetToken(c.token) + pm.SetBody(bytes.NewReader(msg.Payload)) atomic.AddUint32(&c.observe, 1) var opts message.Options @@ -103,6 +99,8 @@ func (c *client) Handle(msg *messaging.Message) error { return fmt.Errorf("cannot set options to response: %w", err) } - m.Options = opts - return c.client.WriteMessage(&m) + for _, option := range opts { + pm.SetOptionBytes(option.ID, option.Value) + } + return c.client.Conn().WriteMessage(pm) } diff --git a/go.mod b/go.mod index 67284229f2..be55031b17 100644 --- a/go.mod +++ b/go.mod @@ -37,7 +37,7 @@ require ( github.com/oklog/ulid/v2 v2.1.0 github.com/ory/dockertest/v3 v3.10.0 github.com/pelletier/go-toml v1.9.5 - github.com/plgd-dev/go-coap/v2 v2.6.0 + github.com/plgd-dev/go-coap/v3 v3.3.3 github.com/prometheus/client_golang v1.19.0 github.com/rabbitmq/amqp091-go v1.9.0 github.com/rubenv/sql-migrate v1.6.1 @@ -143,11 +143,10 @@ require ( github.com/opencontainers/image-spec v1.1.0 // indirect github.com/opencontainers/runc v1.1.12 // indirect github.com/pelletier/go-toml/v2 v2.2.0 // indirect - github.com/pion/dtls/v2 v2.2.10 // indirect + github.com/pion/dtls/v2 v2.2.8-0.20240201071732-2597464081c8 // indirect github.com/pion/logging v0.2.2 // indirect - github.com/pion/transport/v2 v2.2.4 // indirect + github.com/pion/transport/v3 v3.0.1 // indirect github.com/pkg/errors v0.9.1 // indirect - github.com/plgd-dev/kit/v2 v2.0.0-20211006190727-057b33161b90 // indirect github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect github.com/prometheus/client_model v0.6.1 // indirect github.com/prometheus/common v0.52.2 // indirect diff --git a/go.sum b/go.sum index 3cb1f870e1..8f1ff79017 100644 --- a/go.sum +++ b/go.sum @@ -1,5 +1,4 @@ cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go/compute v1.25.1 h1:ZRpHJedLtTpKgr3RV1Fx23NuaAEN1Zfx9hw1u4aJdjU= cloud.google.com/go/compute v1.25.1/go.mod h1:oopOIR53ly6viBYxaDhBfJwzUAxf1zE//uf3IB011ls= cloud.google.com/go/compute/metadata v0.2.3 h1:mg4jlk7mCAj6xXp9UJ4fjI9VUI5rubuGBW5aJ7UnBMY= @@ -46,7 +45,6 @@ github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869 h1:DDGfHa7BWjL4Yn github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869/go.mod h1:Ekp36dRnpXw/yCqJaO+ZrUyxD+3VXMFFr56k5XYrpB4= github.com/caarlos0/env/v10 v10.0.0 h1:yIHUBZGsyqCnpTkbjk8asUlx6RFhhEs+h7TOBdgdzXA= github.com/caarlos0/env/v10 v10.0.0/go.mod h1:ZfulV76NvVPw3tm591U4SwL3Xx9ldzBP9aGxzeN7G18= -github.com/cenkalti/backoff v2.2.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM= github.com/cenkalti/backoff/v3 v3.0.0/go.mod h1:cIeZDE3IrqwwJl6VUwCN6trj1oXrTS4rc0ij+ULvLYs= github.com/cenkalti/backoff/v3 v3.2.2 h1:cfUAAO3yvKMYKPrvhDuHSwQnhZNk/RMHKdZqKTxfm6M= github.com/cenkalti/backoff/v3 v3.2.2/go.mod h1:cIeZDE3IrqwwJl6VUwCN6trj1oXrTS4rc0ij+ULvLYs= @@ -76,7 +74,6 @@ github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1 github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= 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/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78= github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc= github.com/docker/cli v26.0.0+incompatible h1:90BKrx1a1HKYpSnnBFR6AgDq/FqkHxwlUyzJVPxD30I= @@ -87,8 +84,6 @@ github.com/docker/go-connections v0.5.0 h1:USnMq7hx7gwdVZq1L49hLXaFtUdTADjXGp+uj github.com/docker/go-connections v0.5.0/go.mod h1:ov60Kzw0kKElRwhNs9UlUHAE/F9Fe6GLaXnqyDdmEXc= 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/dsnet/golib/memfile v0.0.0-20190531212259-571cdbcff553/go.mod h1:tXGNW9q3RwvWt1VV2qrRKlSSz0npnh12yftCSCy2T64= -github.com/dsnet/golib/memfile v0.0.0-20200723050859-c110804dfa93/go.mod h1:tXGNW9q3RwvWt1VV2qrRKlSSz0npnh12yftCSCy2T64= github.com/dsnet/golib/memfile v1.0.0 h1:J9pUspY2bDCbF9o+YGwcf3uG6MdyITfh/Fk3/CaEiFs= github.com/dsnet/golib/memfile v1.0.0/go.mod h1:tXGNW9q3RwvWt1VV2qrRKlSSz0npnh12yftCSCy2T64= github.com/eclipse/paho.mqtt.golang v1.4.3 h1:2kwcUGn8seMUfWndX0hGbvH8r7crgcJguQNCyp70xik= @@ -109,14 +104,11 @@ github.com/fiorix/go-smpp v0.0.0-20210403173735-2894b96e70ba h1:vBqABUa2HUSc6tj2 github.com/fiorix/go-smpp v0.0.0-20210403173735-2894b96e70ba/go.mod h1:VfKFK7fGeCP81xEhbrOqUEh45n73Yy6jaPWwTVbxprI= github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8= github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0= -github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA= github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM= -github.com/fxamacker/cbor/v2 v2.2.0/go.mod h1:TA1xS00nchWmaBnEIxPSE5oHLuJBAVvqrtAnWBwBCVo= github.com/fxamacker/cbor/v2 v2.6.0 h1:sU6J2usfADwWlYDAFhZBQ6TnLFBHxgesMrQfQgk1tWA= github.com/fxamacker/cbor/v2 v2.6.0/go.mod h1:pxXPTn3joSm21Gbwsv0w9OSA2y1HFR9qXEeXQVeNoDQ= -github.com/go-acme/lego v2.7.2+incompatible/go.mod h1:yzMNe9CasVUhkquNvti5nAtPmG94USbYxYrZfTkIn0M= github.com/go-chi/chi/v5 v5.0.12 h1:9euLV5sTrTNTRUU9POmDUvfxyj6LAABLUcEWO+JJb4s= github.com/go-chi/chi/v5 v5.0.12/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/go-gorp/gorp/v3 v3.1.0 h1:ItKF/Vbuj31dmV4jxA1qblpSwkl9g1typ24xoe70IGs= @@ -130,7 +122,6 @@ github.com/go-kit/kit v0.13.0/go.mod h1:phqEHMMUbyrCFCTgH48JueqrM3md2HcAZ8N3XE4F github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= github.com/go-kit/log v0.2.1 h1:MRVx0/zhvdseW+Gza6N9rVzU/IVzaeE1SFI4raAhmBU= github.com/go-kit/log v0.2.1/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0= -github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= github.com/go-logfmt/logfmt v0.6.0 h1:wGYYu3uicYdqXVgoYbvnkrPVXkuLM1p1ifugDMEdRi4= github.com/go-logfmt/logfmt v0.6.0/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= @@ -139,8 +130,6 @@ github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ= github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= -github.com/go-ocf/go-coap/v2 v2.0.4-0.20200728125043-f38b86f047a7/go.mod h1:X9wVKcaOSx7wBxKcvrWgMQq1R2DNeA7NBLW2osIb8TM= -github.com/go-ocf/kit v0.0.0-20200728130040-4aebdb6982bc/go.mod h1:TIsoMT/iB7t9P6ahkcOnsmvS83SIJsv9qXRfz/yLf6M= github.com/go-redis/redis/v8 v8.11.5 h1:AcZZR7igkdvfVmQTPnu9WE37LRrO/YrBH5zWyjDC0oI= github.com/go-redis/redis/v8 v8.11.5/go.mod h1:gREzHqY1hg6oD9ngVRbLStwAWKhA0FEgq8Jd4h5lpwo= github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= @@ -153,12 +142,9 @@ github.com/goccy/go-json v0.10.2 h1:CrxCmQqYDkv1z7lO7Wbh2HN93uovUHgrECaO5ZrCXAU= github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= github.com/gocql/gocql v1.6.0 h1:IdFdOTbnpbd0pDhl4REKQDM+Q0SzKXQ1Yh+YZZ8T/qU= github.com/gocql/gocql v1.6.0/go.mod h1:3gM2c4D3AnkISwBxGnMMsS8Oy4y2lhbPRsH4xnJrHG8= -github.com/gofrs/uuid v3.3.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= github.com/gofrs/uuid v4.0.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= github.com/gofrs/uuid v4.4.0+incompatible h1:3qXRTX8/NbyulANqlc0lchS1gqAVxRgsuW1YrTJupqA= github.com/gofrs/uuid v4.4.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= -github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= -github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= @@ -166,21 +152,12 @@ github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfb github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= -github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= -github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= -github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= -github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= -github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= -github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM= github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= -github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= @@ -194,10 +171,8 @@ github.com/gookit/color v1.5.4 h1:FZmqs7XOyGgCAxmWyPslpiok1k05wmY3SJTytgvYFs0= github.com/gookit/color v1.5.4/go.mod h1:pZJOeOS8DM43rXbp4AZo1n9zCU2qjpcRko0b6/QJi9w= github.com/gopcua/opcua v0.1.6 h1:B9SVRKQGzcWcwP2QPYN93Uku32+3wL+v5cgzBxE6V5I= github.com/gopcua/opcua v0.1.6/go.mod h1:INwnDoRxmNWAt7+tzqxuGqQkSF2c1C69VAL0c2q6AcY= -github.com/gorilla/mux v1.7.4/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= github.com/gorilla/websocket v1.5.1 h1:gmztn0JnHVt9JZquRuzLw3g4wouNVzKL15iLr/zn/QY= github.com/gorilla/websocket v1.5.1/go.mod h1:x3kM2JMyaluk02fnUJpQuwD2dCS5NDG2ZHL0uE0tcaY= -github.com/grpc-ecosystem/go-grpc-middleware v1.2.0/go.mod h1:mJzapYve32yjrKlk9GbyCZHuPgZsrbyIbyKhSzOpg6s= github.com/grpc-ecosystem/go-grpc-middleware v1.4.0 h1:UH//fgunKIs4JdUbpDl1VZCDaL56wXCB/5+wF6uHfaI= github.com/grpc-ecosystem/go-grpc-middleware v1.4.0/go.mod h1:g5qyo/la0ALbONm6Vbp88Yd8NsDy6rZz+RcrMPxvld8= github.com/grpc-ecosystem/grpc-gateway/v2 v2.19.1 h1:/c3QmbOGMGTOumP2iT/rCwB7b0QDGLKzqOmktBjT+Is= @@ -306,23 +281,17 @@ github.com/jackc/puddle v1.1.3/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dv github.com/jackc/puddle v1.3.0/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= github.com/jackc/puddle/v2 v2.2.1 h1:RhxXJtFG022u4ibrCSMSiu5aOq1i77R3OHKNJj77OAk= github.com/jackc/puddle/v2 v2.2.1/go.mod h1:vriiEXHvEE654aYKXXjOvZM39qJ0q+azkZFrfEOc3H4= -github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= github.com/jmoiron/sqlx v1.3.5 h1:vFFPA71p1o5gAeqtEAwLU4dnX2napprKtHr7PYIcN3g= github.com/jmoiron/sqlx v1.3.5/go.mod h1:nRVWtLre0KfCLJvgxzCsLVMogSvQ1zNJtpYr2Ccp0mQ= github.com/juju/gnuflag v0.0.0-20171113085948-2ce1bb71843d/go.mod h1:2PavIy+JPciBPrBUjwbNvtwB6RQlve+hkpll6QSNmOE= github.com/jzelinskie/stringz v0.0.3 h1:0GhG3lVMYrYtIvRbxvQI6zqRTT1P1xyQlpa0FhfUXas= github.com/jzelinskie/stringz v0.0.3/go.mod h1:hHYbgxJuNLRw91CmpuFsYEOyQqpDVFg8pvEh23vy4P0= -github.com/kelseyhightower/envconfig v1.4.0/go.mod h1:cccZRl6mQpaq41TPp5QxidR+Sa3axMbJDNb//FQX6Gg= -github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= -github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= 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.10.4/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= github.com/klauspost/compress v1.17.8 h1:YcnTYrq7MikUT7k0Yb5eceMmALQPYBW/Xltxn0NAMnU= github.com/klauspost/compress v1.17.8/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= 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= @@ -337,15 +306,12 @@ github.com/lestrrat-go/httpcc v1.0.1 h1:ydWCStUeJLkpYyjLDHihupbn2tYmZ7m22BGkcvZZ github.com/lestrrat-go/httpcc v1.0.1/go.mod h1:qiltp3Mt56+55GPVCbTdM9MlqhvzyuL6W/NMDA8vA5E= github.com/lestrrat-go/httprc v1.0.5 h1:bsTfiH8xaKOJPrg1R+E3iE/AWZr/x0Phj9PBTG/OLUk= github.com/lestrrat-go/httprc v1.0.5/go.mod h1:mwwz3JMTPBjHUkkDv/IGJ39aALInZLrhBp0X7KGUZlo= -github.com/lestrrat-go/iter v0.0.0-20200422075355-fc1769541911/go.mod h1:zIdgO1mRKhn8l9vrZJZz9TUMMFbQbLeTsbqPDrJ/OJc= github.com/lestrrat-go/iter v1.0.2 h1:gMXo1q4c2pHmC3dn8LzRhJfP1ceCbgSiT9lUydIzltI= github.com/lestrrat-go/iter v1.0.2/go.mod h1:Momfcq3AnRlRjI5b5O8/G5/BvpzrhoFTZcn06fEOPt4= -github.com/lestrrat-go/jwx v1.0.2/go.mod h1:TPF17WiSFegZo+c20fdpw49QD+/7n4/IsGvEmCSWwT0= github.com/lestrrat-go/jwx/v2 v2.0.21 h1:jAPKupy4uHgrHFEdjVjNkUgoBKtVDgrQPB/h55FHrR0= github.com/lestrrat-go/jwx/v2 v2.0.21/go.mod h1:09mLW8zto6bWL9GbwnqAli+ArLf+5M33QLQPDggkUWM= github.com/lestrrat-go/option v1.0.1 h1:oAzP2fvZGQKWkvHa1/SAcFolBEca1oN+mQ7eooNBEYU= github.com/lestrrat-go/option v1.0.1/go.mod h1:5ZHFbivi4xwXxhxY9XHDe2FHo6/Z7WWmtT7T5nBBp3I= -github.com/lestrrat-go/pdebug v0.0.0-20200204225717-4d6bd78da58d/go.mod h1:B06CSso/AWxiPejj+fheUINGeBKeeEZNt8w+EoU7+L8= github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/lib/pq v1.1.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/lib/pq v1.2.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= @@ -374,7 +340,6 @@ github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D github.com/mattn/go-sqlite3 v1.14.6/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= github.com/mattn/go-sqlite3 v1.14.19 h1:fhGleo2h1p8tVChob4I9HpmVFIAkKGpiukdrgQbWfGI= github.com/mattn/go-sqlite3 v1.14.19/go.mod h1:2eHXhiwb8IkHr+BDWZGa96P6+rkvnG63S2DGjv9HUNg= -github.com/miekg/dns v1.1.29/go.mod h1:KNUDUusw/aVsxyTYZM1oqvCicbwhgbNgztCETuNZ7xM= github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= @@ -413,37 +378,24 @@ github.com/opencontainers/runc v1.1.12/go.mod h1:S+lQwSfncpBha7XTy/5lBwWgm5+y5Ma github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= github.com/ory/dockertest/v3 v3.10.0 h1:4K3z2VMe8Woe++invjaTB7VRyQXQy5UY+loujO4aNE4= github.com/ory/dockertest/v3 v3.10.0/go.mod h1:nr57ZbRWMqfsdGdFNLHz5jjNdDb7VVFnzAeW1n5N1Lg= -github.com/panjf2000/ants/v2 v2.4.3/go.mod h1:f6F0NZVFsGCp5A7QW/Zj/m92atWwOkY0OIhFxRNFr4A= github.com/pascaldekloe/goe v0.1.0 h1:cBOtyMzM9HTpWjXfbbunk26uA6nG3a8n06Wieeh0MwY= github.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= -github.com/patrickmn/go-cache v2.1.0+incompatible/go.mod h1:3Qf8kWWT7OJRJbdiICTKqZju1ZixQ/KpMGzzAfe6+WQ= github.com/pborman/getopt v0.0.0-20170112200414-7148bc3a4c30/go.mod h1:85jBQOZwpVEaDAr341tbn15RS4fCAsIst0qp7i8ex1o= github.com/pelletier/go-toml v1.9.5 h1:4yBQzkHv+7BHq2PQUZF3Mx0IYxG7LsP222s7Agd3ve8= github.com/pelletier/go-toml v1.9.5/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= github.com/pelletier/go-toml/v2 v2.2.0 h1:QLgLl2yMN7N+ruc31VynXs1vhMZa7CeHHejIeBAsoHo= github.com/pelletier/go-toml/v2 v2.2.0/go.mod h1:1t835xjRzz80PqgE6HHgN2JOsmgYu/h4qDAS4n929Rs= -github.com/pion/dtls/v2 v2.0.1-0.20200503085337-8e86b3a7d585/go.mod h1:/GahSOC8ZY/+17zkaGJIG4OUkSGAcZu/N/g3roBOCkM= -github.com/pion/dtls/v2 v2.0.10-0.20210502094952-3dc563b9aede/go.mod h1:86wv5dgx2J/z871nUR+5fTTY9tISLUlo+C5Gm86r1Hs= -github.com/pion/dtls/v2 v2.2.10 h1:u2Axk+FyIR1VFTPurktB+1zoEPGIW3bmyj3LEFrXjAA= -github.com/pion/dtls/v2 v2.2.10/go.mod h1:d9SYc9fch0CqK90mRk1dC7AkzzpwJj6u2GU3u+9pqFE= +github.com/pion/dtls/v2 v2.2.8-0.20240201071732-2597464081c8 h1:r7K+oQUYubeA0am08kTAvd2wT2D8PZggs/CpMGp0nkM= +github.com/pion/dtls/v2 v2.2.8-0.20240201071732-2597464081c8/go.mod h1:/gft3czh67pwl4nM1BBUvF7eTy72uGkObJXOYfxRDbA= github.com/pion/logging v0.2.2 h1:M9+AIj/+pxNsDfAT64+MAVgJO0rsyLnoJKCqf//DoeY= github.com/pion/logging v0.2.2/go.mod h1:k0/tDVsRCX2Mb2ZEmTqNa7CWsQPc+YYCB7Q+5pahoms= -github.com/pion/transport v0.10.0/go.mod h1:BnHnUipd0rZQyTVB2SBGojFHT9CBt5C5TcsJSQGkvSE= -github.com/pion/transport v0.12.2/go.mod h1:N3+vZQD9HlDP5GWkZ85LohxNsDcNgofQmyL6ojX5d8Q= -github.com/pion/transport v0.12.3/go.mod h1:OViWW9SP2peE/HbwBvARicmAVnesphkNkCVZIWJ6q9A= -github.com/pion/transport/v2 v2.2.4 h1:41JJK6DZQYSeVLxILA2+F4ZkKb4Xd/tFJZRFZQ9QAlo= -github.com/pion/transport/v2 v2.2.4/go.mod h1:q2U/tf9FEfnSBGSW6w5Qp5PFWRLRj3NjLhCCgpRK4p0= -github.com/pion/udp v0.1.1/go.mod h1:6AFo+CMdKQm7UiA0eUPA8/eVCTx8jBIITLZHc9DWX5M= +github.com/pion/transport/v3 v3.0.1 h1:gDTlPJwROfSfz6QfSi0ZmeCSkFcnWWiiR9ES0ouANiM= +github.com/pion/transport/v3 v3.0.1/go.mod h1:UY7kiITrlMv7/IKgd5eTUcaahZx5oUN3l9SzK5f5xE0= 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/plgd-dev/go-coap/v2 v2.0.4-0.20200819112225-8eb712b901bc/go.mod h1:+tCi9Q78H/orWRtpVWyBgrr4vKFo2zYtbbxUllerBp4= -github.com/plgd-dev/go-coap/v2 v2.4.1-0.20210517130748-95c37ac8e1fa/go.mod h1:rA7fc7ar+B/qa+Q0hRqv7yj/EMtIlmo1l7vkQGSrHPU= -github.com/plgd-dev/go-coap/v2 v2.6.0 h1:T8tefZK4jag1ssr6gAGU+922QhVcrjk207aPhdg7i3o= -github.com/plgd-dev/go-coap/v2 v2.6.0/go.mod h1:wm9fcL58Ky442Krix74S9Y54rCo36u59xFcYKRQaSBg= -github.com/plgd-dev/kit v0.0.0-20200819113605-d5fcf3e94f63/go.mod h1:Yl9zisyXfPdtP9hTWlJqjJYXmgU/jtSDKttz9/CeD90= -github.com/plgd-dev/kit/v2 v2.0.0-20211006190727-057b33161b90 h1:TC1HJ/UbyflJFPvaOdGmNZ5TeFGex1/dyr9urNGLy7M= -github.com/plgd-dev/kit/v2 v2.0.0-20211006190727-057b33161b90/go.mod h1:Z7oKFLSGQjdi8eInxwFCs0tSApuEM1o0qNck+sJYp4M= +github.com/plgd-dev/go-coap/v3 v3.3.3 h1:Cbw5TUFRygqz6UXjrRZvfP5RpxWIX8UzaodAjnmf1ko= +github.com/plgd-dev/go-coap/v3 v3.3.3/go.mod h1:Z2Cucu5EelDWdk684WbL7S5mV9/ZA7ejixcpYaB7gSg= 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= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= @@ -525,12 +477,7 @@ github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsT github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/subosito/gotenv v1.6.0 h1:9NlTDc1FTs4qu0DDq7AEtTPNw6SVm7uBMsUCUjABIf8= github.com/subosito/gotenv v1.6.0/go.mod h1:Dk4QP5c2W3ibzajGcXpNraDfq2IrhjMIvMSWPKKo0FU= -github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw= -github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY= github.com/urfave/cli v1.22.5/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= -github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= -github.com/valyala/fasthttp v1.12.0/go.mod h1:229t1eWu9UXTPmoUkbpN/fctKPBY4IJoFXQnxHGXy6E= -github.com/valyala/tcplisten v0.0.0-20161114210144-ceec8f93295a/go.mod h1:v3UYOV9WzVtRmSR+PDvWpU/qWl4Wa5LApYYX4ZtKbio= github.com/x448/float16 v0.8.4 h1:qLwI1I70+NjRFUR3zs1JPUCgaCXSh3SW62uAKT1mSBM= github.com/x448/float16 v0.8.4/go.mod h1:14CWIYCyZA/cWjXOioeEpHeN/83MdbZDRQHoFcYsOfg= github.com/xdg-go/pbkdf2 v1.0.0 h1:Su7DPu48wXMwC3bs7MCNG+z4FhcyEuz5dlvchbq0B0c= @@ -594,7 +541,6 @@ go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9E go.uber.org/zap v1.9.1/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= go.uber.org/zap v1.13.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM= -go.uber.org/zap v1.15.0/go.mod h1:Mb2vm2krFEG5DV0W9qcHBYFtp/Wku1cvYaqPsS/WYfc= go.uber.org/zap v1.18.1/go.mod h1:xg/QME4nWcxGxrpdeYfq7UvYrLh66cuVKdrbD1XF/NI= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190411191339-88737f569e3a/go.mod h1:WFFai1msRO1wXaEeE5yQxYXgSfI8pQAWXbQop6sCtWE= @@ -604,11 +550,8 @@ golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8U golang.org/x/crypto v0.0.0-20190911031432-227b76d455e7/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200302210943-78000ba7a073/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20200323165209-0ec3e9974c59/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20200510223506-06a226fb4e37/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20201203163018-be400aefbc4c/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= -golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= @@ -637,22 +580,14 @@ golang.org/x/mod v0.17.0 h1:zY54UmvipHiNd+pm+m0x9KhZ9hl1/7QNMyxXbc6ICqA= golang.org/x/mod v0.17.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= 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-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190923162816-aa69164e4478/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-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201201195509-5d6afe98e0b7/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210502030024-e5908800b52b/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= @@ -663,12 +598,10 @@ golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44= golang.org/x/net v0.24.0 h1:1PcaxkF854Fu3+lvBIx5SYn9wRlBzzcnHZSiaFFAb0w= golang.org/x/net v0.24.0/go.mod h1:2Q7sJY5mzlzWjKtYUEXSlBWCdyaioyXzRB2RtU8KVE8= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= -golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.19.0 h1:9+E/EZBCbTLNrbN35fHv/a/d/mOBatymz1zbtQrXpIg= golang.org/x/oauth2 v0.19.0/go.mod h1:vYi7skDa1x015PmRRYZ7+s1cWyPgrPiSYRe4rnsexc8= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= 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= @@ -686,16 +619,12 @@ golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190602015325-4c4f7f33c9ed/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/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-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -742,9 +671,7 @@ golang.org/x/time v0.0.0-20200416051211-89c76fbcd5d1/go.mod h1:tRJNPiyCQ0inRvYxb golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.5.0 h1:o7cqy6amK/52YcAKIPlM3a+Fpj35zvRj2TP+e1xFSfk= golang.org/x/time v0.5.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= -golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= @@ -756,9 +683,7 @@ golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtn golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191108193012-7d206e10da11/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191216052735-49a3e744a425/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200103221440-774c71fcf114/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200417140056-c07e33ef3290/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= 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.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= @@ -778,7 +703,6 @@ google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7 google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/genproto v0.0.0-20200423170343-7949de9c1215/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto/googleapis/api v0.0.0-20240401170217-c3f982113cda h1:b6F6WIV4xHHD0FA4oIyzU6mHWg2WI2X1RBehwa5QN38= google.golang.org/genproto/googleapis/api v0.0.0-20240401170217-c3f982113cda/go.mod h1:AHcE/gZH76Bk/ROZhQphlRoWo5xKDEtz3eVEO1LfA8c= google.golang.org/genproto/googleapis/rpc v0.0.0-20240401170217-c3f982113cda h1:LI5DOvAxUPMv/50agcLLoo+AdWc1irS9Rzz4vPuD1V4= @@ -790,12 +714,6 @@ google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8 google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= google.golang.org/grpc v1.63.2 h1:MUeiw1B2maTVZthpU5xvASfTh3LDbxHd6IJ6QQVU+xM= google.golang.org/grpc v1.63.2/go.mod h1:WAX/8DgncnokcFUldAxq7GeB5DXHDbMF+lLvDomNkRA= -google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= -google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= -google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= -google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= -google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= -google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.33.0 h1:uNO2rsAINq/JlFpSdYEKIZ0uKD/R9cpdv0T+yoGwGmI= google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc h1:2gGKlE2+asNV9m7xrywl36YYNnBG5ZQ0r/BOOxqPpmk= @@ -812,11 +730,9 @@ gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/square/go-jose.v2 v2.5.1/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.7/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= diff --git a/internal/server/coap/coap.go b/internal/server/coap/coap.go index a1816b961b..6bdc496e49 100644 --- a/internal/server/coap/coap.go +++ b/internal/server/coap/coap.go @@ -10,8 +10,8 @@ import ( "time" "github.com/absmach/magistrala/internal/server" - gocoap "github.com/plgd-dev/go-coap/v2" - "github.com/plgd-dev/go-coap/v2/mux" + gocoap "github.com/plgd-dev/go-coap/v3" + "github.com/plgd-dev/go-coap/v3/mux" ) const ( From 5561259f0ad665387c35c306dbde062a39df34f7 Mon Sep 17 00:00:00 2001 From: 1998-felix Date: Wed, 17 Apr 2024 08:33:36 +0300 Subject: [PATCH 02/14] Dep: Update gocoap from v2 to v3 Signed-off-by: 1998-felix --- coap/api/transport.go | 4 +++- coap/client.go | 5 ++++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/coap/api/transport.go b/coap/api/transport.go index 417c24255f..d40b51f749 100644 --- a/coap/api/transport.go +++ b/coap/api/transport.go @@ -93,12 +93,14 @@ func handler(w mux.ResponseWriter, m *mux.Message) { if err != nil { logger.Warn(fmt.Sprintf("Error decoding message: %s", err)) resp.Code = codes.BadRequest + sendResp(w, &resp, false) return } key, err := parseKey(m) if err != nil { logger.Warn(fmt.Sprintf("Error parsing auth: %s", err)) resp.Code = codes.Unauthorized + sendResp(w, &resp, false) return } var isObs bool = false @@ -107,7 +109,7 @@ func handler(w mux.ResponseWriter, m *mux.Message) { isObs, err = handleGet(context.Background(), m, w, msg, key) case codes.POST: resp.Code = codes.Created - err = nil + err = service.Publish(m.Context(), key, msg) default: err = svcerr.ErrNotFound } diff --git a/coap/client.go b/coap/client.go index ea8a52e17a..08a26f36f8 100644 --- a/coap/client.go +++ b/coap/client.go @@ -102,5 +102,8 @@ func (c *client) Handle(msg *messaging.Message) error { for _, option := range opts { pm.SetOptionBytes(option.ID, option.Value) } - return c.client.Conn().WriteMessage(pm) + if err = c.client.Conn().WriteMessage(pm); err != nil { + return err + } + return nil } From 28af5566a7dea7834572f19c81a05d34726305d0 Mon Sep 17 00:00:00 2001 From: 1998-felix Date: Fri, 19 Apr 2024 09:24:36 +0300 Subject: [PATCH 03/14] Ref: refactor code Signed-off-by: 1998-felix --- coap/api/transport.go | 65 +++++++++++++++++++++---------------------- 1 file changed, 31 insertions(+), 34 deletions(-) diff --git a/coap/api/transport.go b/coap/api/transport.go index d40b51f749..365bd0902b 100644 --- a/coap/api/transport.go +++ b/coap/api/transport.go @@ -4,7 +4,6 @@ package api import ( - "bytes" "context" "fmt" "io" @@ -23,6 +22,7 @@ import ( "github.com/go-chi/chi/v5" "github.com/plgd-dev/go-coap/v3/message" "github.com/plgd-dev/go-coap/v3/message/codes" + "github.com/plgd-dev/go-coap/v3/message/pool" "github.com/plgd-dev/go-coap/v3/mux" "github.com/prometheus/client_golang/prometheus/promhttp" ) @@ -67,80 +67,77 @@ func MakeCoAPHandler(svc coap.Service, l *slog.Logger) mux.HandlerFunc { return handler } -func sendResp(w mux.ResponseWriter, resp *message.Message, isObs bool) { - pm := w.Conn().AcquireMessage(w.Conn().Context()) - defer w.Conn().ReleaseMessage(pm) - pm.SetCode(resp.Code) - pm.SetToken(resp.Token) - pm.SetBody(bytes.NewReader(resp.Payload)) - for _, opt := range resp.Options { - pm.SetOptionBytes(opt.ID, opt.Value) - } - if !isObs { - if err := w.Conn().WriteMessage(pm); err != nil { - logger.Warn(fmt.Sprintf("Can't set response: %s", err)) +func sendResp(w mux.ResponseWriter, resp *pool.Message) { + if resp.Code() == codes.Content { + obs, err := resp.Options().Observe() + if err != nil { + logger.Warn(fmt.Sprintf("Error reading observe option: %s", err)) + } + if obs == startObserve { + return } } + if err := w.Conn().WriteMessage(resp); err != nil { + logger.Warn(fmt.Sprintf("Can't set response: %s", err)) + } } func handler(w mux.ResponseWriter, m *mux.Message) { - resp := message.Message{ - Code: codes.Content, - Token: m.Token(), - Options: make(message.Options, 0, 16), - } + resp := pool.NewMessage(w.Conn().Context()) + resp.SetToken(m.Token()) + defer sendResp(w, resp) + msg, err := decodeMessage(m) if err != nil { logger.Warn(fmt.Sprintf("Error decoding message: %s", err)) - resp.Code = codes.BadRequest - sendResp(w, &resp, false) + resp.SetCode(codes.BadRequest) return } key, err := parseKey(m) if err != nil { logger.Warn(fmt.Sprintf("Error parsing auth: %s", err)) - resp.Code = codes.Unauthorized - sendResp(w, &resp, false) + resp.SetCode(codes.Unauthorized) return } - var isObs bool = false + switch m.Code() { case codes.GET: - isObs, err = handleGet(context.Background(), m, w, msg, key) + err = handleGet(context.Background(), m, w, msg, key) + resp.SetCode(codes.Content) case codes.POST: - resp.Code = codes.Created + resp.SetCode(codes.Created) err = service.Publish(m.Context(), key, msg) default: err = svcerr.ErrNotFound } - defer sendResp(w, &resp, isObs) + if err != nil { switch { case err == errBadOptions: - resp.Code = codes.BadOption + resp.SetCode(codes.BadOption) case err == svcerr.ErrNotFound: - resp.Code = codes.NotFound + resp.SetCode(codes.NotFound) case errors.Contains(err, svcerr.ErrAuthorization), errors.Contains(err, svcerr.ErrAuthentication): - resp.Code = codes.Unauthorized + resp.SetCode(codes.Unauthorized) default: - resp.Code = codes.InternalServerError + resp.SetCode(codes.InternalServerError) } } } -func handleGet(ctx context.Context, m *mux.Message, c mux.ResponseWriter, msg *messaging.Message, key string) (bool, error) { +func handleGet(ctx context.Context, m *mux.Message, c mux.ResponseWriter, msg *messaging.Message, key string) error { var obs uint32 obs, err := m.Observe() if err != nil { logger.Warn(fmt.Sprintf("Error reading observe option: %s", err)) - return false, errBadOptions + return errBadOptions } if obs == startObserve { c := coap.NewClient(c, m.Token(), logger) - return true, service.Subscribe(ctx, key, msg.GetChannel(), msg.GetSubtopic(), c) + return service.Subscribe(ctx, key, msg.GetChannel(), msg.GetSubtopic(), c) } - return false, service.Unsubscribe(ctx, key, msg.GetChannel(), msg.GetSubtopic(), m.Token().String()) + return service.Unsubscribe(ctx, key, msg.GetChannel(), msg.GetSubtopic(), m.Token().String()) } func decodeMessage(msg *mux.Message) (*messaging.Message, error) { From 1ddfaf9991168c1265cb9b4ed72d874f8b693a21 Mon Sep 17 00:00:00 2001 From: 1998-felix Date: Mon, 22 Apr 2024 16:53:15 +0300 Subject: [PATCH 04/14] refactor: rename coap client to mux writer Signed-off-by: 1998-felix --- coap/api/transport.go | 4 ++-- coap/client.go | 21 ++++++++++----------- 2 files changed, 12 insertions(+), 13 deletions(-) diff --git a/coap/api/transport.go b/coap/api/transport.go index 365bd0902b..00881b0360 100644 --- a/coap/api/transport.go +++ b/coap/api/transport.go @@ -126,7 +126,7 @@ func handler(w mux.ResponseWriter, m *mux.Message) { } } -func handleGet(ctx context.Context, m *mux.Message, c mux.ResponseWriter, msg *messaging.Message, key string) error { +func handleGet(ctx context.Context, m *mux.Message, writer mux.ResponseWriter, msg *messaging.Message, key string) error { var obs uint32 obs, err := m.Observe() if err != nil { @@ -134,7 +134,7 @@ func handleGet(ctx context.Context, m *mux.Message, c mux.ResponseWriter, msg *m return errBadOptions } if obs == startObserve { - c := coap.NewClient(c, m.Token(), logger) + c := coap.NewClient(writer, m.Token(), logger) return service.Subscribe(ctx, key, msg.GetChannel(), msg.GetSubtopic(), c) } return service.Unsubscribe(ctx, key, msg.GetChannel(), msg.GetSubtopic(), m.Token().String()) diff --git a/coap/client.go b/coap/client.go index 08a26f36f8..70ce363491 100644 --- a/coap/client.go +++ b/coap/client.go @@ -5,7 +5,6 @@ package coap import ( "bytes" - "context" "fmt" "log/slog" "sync/atomic" @@ -37,16 +36,16 @@ type Client interface { var ErrOption = errors.New("unable to set option") type client struct { - client mux.ResponseWriter + writer mux.ResponseWriter token message.Token observe uint32 logger *slog.Logger } // NewClient instantiates a new Observer. -func NewClient(c mux.ResponseWriter, tkn message.Token, l *slog.Logger) Client { +func NewClient(w mux.ResponseWriter, tkn message.Token, l *slog.Logger) Client { return &client{ - client: c, + writer: w, token: tkn, logger: l, observe: 0, @@ -54,17 +53,17 @@ func NewClient(c mux.ResponseWriter, tkn message.Token, l *slog.Logger) Client { } func (c *client) Done() <-chan struct{} { - return c.client.Conn().Done() + return c.writer.Conn().Done() } func (c *client) Cancel() error { - pm := c.client.Conn().AcquireMessage(context.Background()) + pm := c.writer.Conn().AcquireMessage(c.writer.Conn().Context()) pm.SetCode(codes.Content) pm.SetToken(c.token) - if err := c.client.Conn().WriteMessage(pm); err != nil { + if err := c.writer.Conn().WriteMessage(pm); err != nil { c.logger.Error(fmt.Sprintf("Error sending message: %s.", err)) } - return c.client.Conn().Close() + return c.writer.Conn().Close() } func (c *client) Token() string { @@ -72,10 +71,10 @@ func (c *client) Token() string { } func (c *client) Handle(msg *messaging.Message) error { - pm := pool.NewMessage(context.Background()) + pm := pool.NewMessage(c.writer.Conn().Context()) pm.SetCode(codes.Content) pm.SetToken(c.token) - pm.SetBody(bytes.NewReader(msg.Payload)) + pm.SetBody(bytes.NewReader(msg.GetPayload())) atomic.AddUint32(&c.observe, 1) var opts message.Options @@ -102,7 +101,7 @@ func (c *client) Handle(msg *messaging.Message) error { for _, option := range opts { pm.SetOptionBytes(option.ID, option.Value) } - if err = c.client.Conn().WriteMessage(pm); err != nil { + if err = c.writer.Conn().WriteMessage(pm); err != nil { return err } return nil From 02702109093137828ea749b40e2092b1fbd0ae15 Mon Sep 17 00:00:00 2001 From: 1998-felix Date: Tue, 23 Apr 2024 11:42:45 +0300 Subject: [PATCH 05/14] Refactor: correct improper context Signed-off-by: 1998-felix --- coap/api/transport.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/coap/api/transport.go b/coap/api/transport.go index 00881b0360..5848f22155 100644 --- a/coap/api/transport.go +++ b/coap/api/transport.go @@ -102,7 +102,7 @@ func handler(w mux.ResponseWriter, m *mux.Message) { switch m.Code() { case codes.GET: - err = handleGet(context.Background(), m, w, msg, key) + err = handleGet(m.Context(), m, w, msg, key) resp.SetCode(codes.Content) case codes.POST: resp.SetCode(codes.Created) From 81e7222970fe9cab7b1cd178a38de26a08cbd184 Mon Sep 17 00:00:00 2001 From: 1998-felix Date: Tue, 23 Apr 2024 16:12:36 +0300 Subject: [PATCH 06/14] refactor: propagate options to response Signed-off-by: 1998-felix --- coap/api/transport.go | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/coap/api/transport.go b/coap/api/transport.go index 5848f22155..d233540b3c 100644 --- a/coap/api/transport.go +++ b/coap/api/transport.go @@ -85,6 +85,9 @@ func sendResp(w mux.ResponseWriter, resp *pool.Message) { func handler(w mux.ResponseWriter, m *mux.Message) { resp := pool.NewMessage(w.Conn().Context()) resp.SetToken(m.Token()) + for _, opt := range m.Options() { + resp.AddOptionBytes(opt.ID, opt.Value) + } defer sendResp(w, resp) msg, err := decodeMessage(m) @@ -128,7 +131,7 @@ func handler(w mux.ResponseWriter, m *mux.Message) { func handleGet(ctx context.Context, m *mux.Message, writer mux.ResponseWriter, msg *messaging.Message, key string) error { var obs uint32 - obs, err := m.Observe() + obs, err := m.Options().Observe() if err != nil { logger.Warn(fmt.Sprintf("Error reading observe option: %s", err)) return errBadOptions From ff719d047f81d3d08b14b68fadb65d766e1a2e56 Mon Sep 17 00:00:00 2001 From: 1998-felix Date: Tue, 23 Apr 2024 18:26:40 +0300 Subject: [PATCH 07/14] fix: Fix self terminating observation Signed-off-by: 1998-felix --- coap/api/transport.go | 4 ++-- coap/client.go | 20 ++++++++++---------- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/coap/api/transport.go b/coap/api/transport.go index d233540b3c..5ad0947c71 100644 --- a/coap/api/transport.go +++ b/coap/api/transport.go @@ -129,7 +129,7 @@ func handler(w mux.ResponseWriter, m *mux.Message) { } } -func handleGet(ctx context.Context, m *mux.Message, writer mux.ResponseWriter, msg *messaging.Message, key string) error { +func handleGet(ctx context.Context, m *mux.Message, w mux.ResponseWriter, msg *messaging.Message, key string) error { var obs uint32 obs, err := m.Options().Observe() if err != nil { @@ -137,7 +137,7 @@ func handleGet(ctx context.Context, m *mux.Message, writer mux.ResponseWriter, m return errBadOptions } if obs == startObserve { - c := coap.NewClient(writer, m.Token(), logger) + c := coap.NewClient(w.Conn(), m.Token(), logger) return service.Subscribe(ctx, key, msg.GetChannel(), msg.GetSubtopic(), c) } return service.Unsubscribe(ctx, key, msg.GetChannel(), msg.GetSubtopic(), m.Token().String()) diff --git a/coap/client.go b/coap/client.go index 70ce363491..b435b9b36b 100644 --- a/coap/client.go +++ b/coap/client.go @@ -36,16 +36,16 @@ type Client interface { var ErrOption = errors.New("unable to set option") type client struct { - writer mux.ResponseWriter + conn mux.Conn token message.Token observe uint32 logger *slog.Logger } // NewClient instantiates a new Observer. -func NewClient(w mux.ResponseWriter, tkn message.Token, l *slog.Logger) Client { +func NewClient(cc mux.Conn, tkn message.Token, l *slog.Logger) Client { return &client{ - writer: w, + conn: cc, token: tkn, logger: l, observe: 0, @@ -53,17 +53,17 @@ func NewClient(w mux.ResponseWriter, tkn message.Token, l *slog.Logger) Client { } func (c *client) Done() <-chan struct{} { - return c.writer.Conn().Done() + return c.conn.Done() } func (c *client) Cancel() error { - pm := c.writer.Conn().AcquireMessage(c.writer.Conn().Context()) + pm := c.conn.AcquireMessage(c.conn.Context()) pm.SetCode(codes.Content) pm.SetToken(c.token) - if err := c.writer.Conn().WriteMessage(pm); err != nil { + if err := c.conn.WriteMessage(pm); err != nil { c.logger.Error(fmt.Sprintf("Error sending message: %s.", err)) } - return c.writer.Conn().Close() + return c.conn.Close() } func (c *client) Token() string { @@ -71,7 +71,7 @@ func (c *client) Token() string { } func (c *client) Handle(msg *messaging.Message) error { - pm := pool.NewMessage(c.writer.Conn().Context()) + pm := pool.NewMessage(c.conn.Context()) pm.SetCode(codes.Content) pm.SetToken(c.token) pm.SetBody(bytes.NewReader(msg.GetPayload())) @@ -88,7 +88,6 @@ func (c *client) Handle(msg *messaging.Message) error { c.logger.Error(fmt.Sprintf("Can't set content format: %s.", err)) return errors.Wrap(ErrOption, err) } - opts = append(opts, message.Option{ID: message.Observe, Value: []byte{byte(c.observe)}}) opts, n, err = opts.SetObserve(buff, c.observe) if err == message.ErrTooSmall { buff = append(buff, make([]byte, n)...) @@ -101,7 +100,8 @@ func (c *client) Handle(msg *messaging.Message) error { for _, option := range opts { pm.SetOptionBytes(option.ID, option.Value) } - if err = c.writer.Conn().WriteMessage(pm); err != nil { + + if err = c.conn.WriteMessage(pm); err != nil { return err } return nil From 561da72d31dc0fbda0778f71e5b1b98c0e39597e Mon Sep 17 00:00:00 2001 From: 1998-felix Date: Wed, 24 Apr 2024 16:49:31 +0300 Subject: [PATCH 08/14] refactor: refactor transport.go send response Signed-off-by: 1998-felix --- coap/api/transport.go | 9 --------- go.sum | 1 - 2 files changed, 10 deletions(-) diff --git a/coap/api/transport.go b/coap/api/transport.go index 5ad0947c71..edf87fc3b5 100644 --- a/coap/api/transport.go +++ b/coap/api/transport.go @@ -68,15 +68,6 @@ func MakeCoAPHandler(svc coap.Service, l *slog.Logger) mux.HandlerFunc { } func sendResp(w mux.ResponseWriter, resp *pool.Message) { - if resp.Code() == codes.Content { - obs, err := resp.Options().Observe() - if err != nil { - logger.Warn(fmt.Sprintf("Error reading observe option: %s", err)) - } - if obs == startObserve { - return - } - } if err := w.Conn().WriteMessage(resp); err != nil { logger.Warn(fmt.Sprintf("Can't set response: %s", err)) } diff --git a/go.sum b/go.sum index 8f1ff79017..5fb699f4ac 100644 --- a/go.sum +++ b/go.sum @@ -116,7 +116,6 @@ github.com/go-gorp/gorp/v3 v3.1.0/go.mod h1:dLEjIyyRNiXvNZ8PSmzpt1GsWAUK8kjVhEpj github.com/go-jose/go-jose/v3 v3.0.1/go.mod h1:RNkWWRld676jZEYoV3+XK8L2ZnNSvIsxFMht0mSX+u8= github.com/go-jose/go-jose/v4 v4.0.1 h1:QVEPDE3OluqXBQZDcnNvQrInro2h0e4eqNbnZSWqS6U= github.com/go-jose/go-jose/v4 v4.0.1/go.mod h1:WVf9LFMHh/QVrmqrOfqun0C45tMe3RoiKJMPvgWwLfY= -github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-kit/kit v0.13.0 h1:OoneCcHKHQ03LfBpoQCUfCluwd2Vt3ohz+kvbJneZAU= github.com/go-kit/kit v0.13.0/go.mod h1:phqEHMMUbyrCFCTgH48JueqrM3md2HcAZ8N3XE4FKDg= github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= From 59a926169c1cddf55ebfda1c419d9d1e5d1ca3f2 Mon Sep 17 00:00:00 2001 From: 1998-felix Date: Thu, 25 Apr 2024 10:30:39 +0300 Subject: [PATCH 09/14] refactor: Change context source in get request Signed-off-by: 1998-felix --- coap/api/transport.go | 9 ++++----- coap/client.go | 6 +----- 2 files changed, 5 insertions(+), 10 deletions(-) diff --git a/coap/api/transport.go b/coap/api/transport.go index edf87fc3b5..96f840438a 100644 --- a/coap/api/transport.go +++ b/coap/api/transport.go @@ -4,7 +4,6 @@ package api import ( - "context" "fmt" "io" "log/slog" @@ -96,7 +95,7 @@ func handler(w mux.ResponseWriter, m *mux.Message) { switch m.Code() { case codes.GET: - err = handleGet(m.Context(), m, w, msg, key) + err = handleGet(m, w, msg, key) resp.SetCode(codes.Content) case codes.POST: resp.SetCode(codes.Created) @@ -120,7 +119,7 @@ func handler(w mux.ResponseWriter, m *mux.Message) { } } -func handleGet(ctx context.Context, m *mux.Message, w mux.ResponseWriter, msg *messaging.Message, key string) error { +func handleGet(m *mux.Message, w mux.ResponseWriter, msg *messaging.Message, key string) error { var obs uint32 obs, err := m.Options().Observe() if err != nil { @@ -129,9 +128,9 @@ func handleGet(ctx context.Context, m *mux.Message, w mux.ResponseWriter, msg *m } if obs == startObserve { c := coap.NewClient(w.Conn(), m.Token(), logger) - return service.Subscribe(ctx, key, msg.GetChannel(), msg.GetSubtopic(), c) + return service.Subscribe(w.Conn().Context(), key, msg.GetChannel(), msg.GetSubtopic(), c) } - return service.Unsubscribe(ctx, key, msg.GetChannel(), msg.GetSubtopic(), m.Token().String()) + return service.Unsubscribe(w.Conn().Context(), key, msg.GetChannel(), msg.GetSubtopic(), m.Token().String()) } func decodeMessage(msg *mux.Message) (*messaging.Message, error) { diff --git a/coap/client.go b/coap/client.go index b435b9b36b..73ab01c87c 100644 --- a/coap/client.go +++ b/coap/client.go @@ -100,9 +100,5 @@ func (c *client) Handle(msg *messaging.Message) error { for _, option := range opts { pm.SetOptionBytes(option.ID, option.Value) } - - if err = c.conn.WriteMessage(pm); err != nil { - return err - } - return nil + return c.conn.WriteMessage(pm) } From 3e82249d4c40d4b6752246a0317c23983f5d2a7c Mon Sep 17 00:00:00 2001 From: 1998-felix Date: Thu, 25 Apr 2024 15:20:30 +0300 Subject: [PATCH 10/14] fix: increase keep alive for connection Signed-off-by: 1998-felix --- internal/server/coap/coap.go | 56 +++++++++++++++++++++++++++--------- 1 file changed, 42 insertions(+), 14 deletions(-) diff --git a/internal/server/coap/coap.go b/internal/server/coap/coap.go index 6bdc496e49..5b9ea11a98 100644 --- a/internal/server/coap/coap.go +++ b/internal/server/coap/coap.go @@ -10,13 +10,16 @@ import ( "time" "github.com/absmach/magistrala/internal/server" - gocoap "github.com/plgd-dev/go-coap/v3" "github.com/plgd-dev/go-coap/v3/mux" + "github.com/plgd-dev/go-coap/v3/net" + "github.com/plgd-dev/go-coap/v3/options" + "github.com/plgd-dev/go-coap/v3/udp" + udpClient "github.com/plgd-dev/go-coap/v3/udp/client" ) -const ( - stopWaitTime = 5 * time.Second -) +// const ( +// stopWaitTime = 5 * time.Second +// ) type Server struct { server.BaseServer @@ -44,26 +47,51 @@ func (s *Server) Start() error { errCh := make(chan error) s.Logger.Info(fmt.Sprintf("%s service started using http, exposed port %s", s.Name, s.Address)) s.Logger.Info(fmt.Sprintf("%s service %s server listening at %s without TLS", s.Name, s.Protocol, s.Address)) + l, err := net.NewListenUDP("udp", s.Address) + if err != nil { + return err + } + defer l.Close() + + s.Logger.Info(fmt.Sprintf("CoAP proxy server started at %s without DTLS", s.Address)) + + dummyInactiveFunc := func(cc *udpClient.Conn) { + // This function intentionally left blank. + } + cs := udp.NewServer( + options.WithMux(mux.HandlerFunc(s.handler)), + options.WithKeepAlive(10, 10*time.Minute, dummyInactiveFunc), + ) + go func() { - errCh <- gocoap.ListenAndServe("udp", s.Address, s.handler) + errCh <- cs.Serve(l) }() select { case <-s.Ctx.Done(): - return s.Stop() + s.Logger.Info(fmt.Sprintf("CoAP proxy server at %s without DTLS exiting ...", s.Address)) + l.Close() case err := <-errCh: + s.Logger.Error(fmt.Sprintf("CoAP proxy server at %s without DTLS exiting with errors: %s", s.Address, err.Error())) return err } + return nil + // select { + // case <-s.Ctx.Done(): + // return s.Stop() + // case err := <-errCh: + // return err + // } } func (s *Server) Stop() error { - defer s.Cancel() - c := make(chan bool) - defer close(c) - select { - case <-c: - case <-time.After(stopWaitTime): - } - s.Logger.Info(fmt.Sprintf("%s service shutdown of http at %s", s.Name, s.Address)) + // defer s.Cancel() + // c := make(chan bool) + // defer close(c) + // select { + // case <-c: + // case <-time.After(stopWaitTime): + // } + // s.Logger.Info(fmt.Sprintf("%s service shutdown of http at %s", s.Name, s.Address)) return nil } From c82066f9f14335d3c9d4de3f4d62aff19c9c18e5 Mon Sep 17 00:00:00 2001 From: 1998-felix Date: Fri, 26 Apr 2024 13:57:35 +0300 Subject: [PATCH 11/14] fix: Change context source for client.handler Signed-off-by: 1998-felix --- coap/client.go | 3 +- internal/server/coap/coap.go | 56 +++++++++--------------------------- 2 files changed, 16 insertions(+), 43 deletions(-) diff --git a/coap/client.go b/coap/client.go index 73ab01c87c..ae3c0107a5 100644 --- a/coap/client.go +++ b/coap/client.go @@ -5,6 +5,7 @@ package coap import ( "bytes" + "context" "fmt" "log/slog" "sync/atomic" @@ -71,7 +72,7 @@ func (c *client) Token() string { } func (c *client) Handle(msg *messaging.Message) error { - pm := pool.NewMessage(c.conn.Context()) + pm := pool.NewMessage(context.Background()) pm.SetCode(codes.Content) pm.SetToken(c.token) pm.SetBody(bytes.NewReader(msg.GetPayload())) diff --git a/internal/server/coap/coap.go b/internal/server/coap/coap.go index 5b9ea11a98..6bdc496e49 100644 --- a/internal/server/coap/coap.go +++ b/internal/server/coap/coap.go @@ -10,16 +10,13 @@ import ( "time" "github.com/absmach/magistrala/internal/server" + gocoap "github.com/plgd-dev/go-coap/v3" "github.com/plgd-dev/go-coap/v3/mux" - "github.com/plgd-dev/go-coap/v3/net" - "github.com/plgd-dev/go-coap/v3/options" - "github.com/plgd-dev/go-coap/v3/udp" - udpClient "github.com/plgd-dev/go-coap/v3/udp/client" ) -// const ( -// stopWaitTime = 5 * time.Second -// ) +const ( + stopWaitTime = 5 * time.Second +) type Server struct { server.BaseServer @@ -47,51 +44,26 @@ func (s *Server) Start() error { errCh := make(chan error) s.Logger.Info(fmt.Sprintf("%s service started using http, exposed port %s", s.Name, s.Address)) s.Logger.Info(fmt.Sprintf("%s service %s server listening at %s without TLS", s.Name, s.Protocol, s.Address)) - l, err := net.NewListenUDP("udp", s.Address) - if err != nil { - return err - } - defer l.Close() - - s.Logger.Info(fmt.Sprintf("CoAP proxy server started at %s without DTLS", s.Address)) - - dummyInactiveFunc := func(cc *udpClient.Conn) { - // This function intentionally left blank. - } - cs := udp.NewServer( - options.WithMux(mux.HandlerFunc(s.handler)), - options.WithKeepAlive(10, 10*time.Minute, dummyInactiveFunc), - ) - go func() { - errCh <- cs.Serve(l) + errCh <- gocoap.ListenAndServe("udp", s.Address, s.handler) }() select { case <-s.Ctx.Done(): - s.Logger.Info(fmt.Sprintf("CoAP proxy server at %s without DTLS exiting ...", s.Address)) - l.Close() + return s.Stop() case err := <-errCh: - s.Logger.Error(fmt.Sprintf("CoAP proxy server at %s without DTLS exiting with errors: %s", s.Address, err.Error())) return err } - return nil - // select { - // case <-s.Ctx.Done(): - // return s.Stop() - // case err := <-errCh: - // return err - // } } func (s *Server) Stop() error { - // defer s.Cancel() - // c := make(chan bool) - // defer close(c) - // select { - // case <-c: - // case <-time.After(stopWaitTime): - // } - // s.Logger.Info(fmt.Sprintf("%s service shutdown of http at %s", s.Name, s.Address)) + defer s.Cancel() + c := make(chan bool) + defer close(c) + select { + case <-c: + case <-time.After(stopWaitTime): + } + s.Logger.Info(fmt.Sprintf("%s service shutdown of http at %s", s.Name, s.Address)) return nil } From 27580cc779515b0c54ec759c2761ec6a363fabca Mon Sep 17 00:00:00 2001 From: 1998-felix Date: Thu, 2 May 2024 13:28:14 +0300 Subject: [PATCH 12/14] fix: add nil monitor as coap server option Signed-off-by: 1998-felix --- coap/client.go | 5 ++--- internal/server/coap/coap.go | 19 ++++++++++++++++++- 2 files changed, 20 insertions(+), 4 deletions(-) diff --git a/coap/client.go b/coap/client.go index ae3c0107a5..a29bcd8d1e 100644 --- a/coap/client.go +++ b/coap/client.go @@ -5,7 +5,6 @@ package coap import ( "bytes" - "context" "fmt" "log/slog" "sync/atomic" @@ -14,7 +13,6 @@ import ( "github.com/absmach/magistrala/pkg/messaging" "github.com/plgd-dev/go-coap/v3/message" "github.com/plgd-dev/go-coap/v3/message/codes" - "github.com/plgd-dev/go-coap/v3/message/pool" mux "github.com/plgd-dev/go-coap/v3/mux" ) @@ -72,7 +70,8 @@ func (c *client) Token() string { } func (c *client) Handle(msg *messaging.Message) error { - pm := pool.NewMessage(context.Background()) + pm := c.conn.AcquireMessage(c.conn.Context()) + defer c.conn.ReleaseMessage(pm) pm.SetCode(codes.Content) pm.SetToken(c.token) pm.SetBody(bytes.NewReader(msg.GetPayload())) diff --git a/internal/server/coap/coap.go b/internal/server/coap/coap.go index 6bdc496e49..f3889008fb 100644 --- a/internal/server/coap/coap.go +++ b/internal/server/coap/coap.go @@ -12,6 +12,8 @@ import ( "github.com/absmach/magistrala/internal/server" gocoap "github.com/plgd-dev/go-coap/v3" "github.com/plgd-dev/go-coap/v3/mux" + "github.com/plgd-dev/go-coap/v3/options" + udpServer "github.com/plgd-dev/go-coap/v3/udp/server" ) const ( @@ -40,12 +42,27 @@ func New(ctx context.Context, cancel context.CancelFunc, name string, config ser } } +type udpNilMonitor struct{} + +func (u *udpNilMonitor) UDPServerApply(cfg *udpServer.Config) { + cfg.CreateInactivityMonitor = nil +} + +var _ udpServer.Option = (*udpNilMonitor)(nil) + +func NewUDPNilMonitor() udpServer.Option { + return &udpNilMonitor{} +} + func (s *Server) Start() error { errCh := make(chan error) s.Logger.Info(fmt.Sprintf("%s service started using http, exposed port %s", s.Name, s.Address)) s.Logger.Info(fmt.Sprintf("%s service %s server listening at %s without TLS", s.Name, s.Protocol, s.Address)) + + opts := []any{} + opts = append(opts, options.WithMux(s.handler), NewUDPNilMonitor()) go func() { - errCh <- gocoap.ListenAndServe("udp", s.Address, s.handler) + errCh <- gocoap.ListenAndServeWithOptions("udp", s.Address, opts...) }() select { From 485d7106870bc55c8405695def1b5db4254f6b3f Mon Sep 17 00:00:00 2001 From: 1998-felix Date: Fri, 3 May 2024 13:45:00 +0300 Subject: [PATCH 13/14] fix: update coap auth flag in e2e test tool Signed-off-by: 1998-felix --- tools/e2e/e2e.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/e2e/e2e.go b/tools/e2e/e2e.go index cc89757d9d..e72c1259f9 100644 --- a/tools/e2e/e2e.go +++ b/tools/e2e/e2e.go @@ -579,7 +579,7 @@ func sendHTTPMessage(s sdk.SDK, msg string, thing sdk.Thing, chanID string) erro } func sendCoAPMessage(msg string, thing sdk.Thing, chanID string) error { - cmd := exec.Command("coap-cli", "post", fmt.Sprintf("channels/%s/messages", chanID), "-auth", thing.Credentials.Secret, "-d", msg) + cmd := exec.Command("coap-cli", "post", fmt.Sprintf("channels/%s/messages", chanID), "--auth", thing.Credentials.Secret, "-d", msg) if _, err := cmd.CombinedOutput(); err != nil { return fmt.Errorf("CoAP failed to send message from thing %s to channel %s: %w", thing.ID, chanID, err) } From 01c35934305bb162a1c7553b574f188b73387147 Mon Sep 17 00:00:00 2001 From: 1998-felix Date: Mon, 6 May 2024 10:51:29 +0300 Subject: [PATCH 14/14] fix: fix unauthorized response on obs cancellation Signed-off-by: 1998-felix --- coap/api/transport.go | 3 --- 1 file changed, 3 deletions(-) diff --git a/coap/api/transport.go b/coap/api/transport.go index 96f840438a..9f92ccdaac 100644 --- a/coap/api/transport.go +++ b/coap/api/transport.go @@ -169,9 +169,6 @@ func decodeMessage(msg *mux.Message) (*messaging.Message, error) { } func parseKey(msg *mux.Message) (string, error) { - if obs, _ := msg.Observe(); obs != 0 && msg.Code() == codes.GET { - return "", nil - } authKey, err := msg.Options().GetString(message.URIQuery) if err != nil { return "", err