From dd95544f816fef6b61cf60342f8c34b93257624d Mon Sep 17 00:00:00 2001 From: Jose Silva Date: Wed, 24 Apr 2024 14:48:45 +0100 Subject: [PATCH] upgrade go to 1.22; upgrade packages; migrate azure/go-amqp to 1.0.5 Signed-off-by: Jose Silva --- protocol/amqp/v2/go.mod | 6 +- protocol/amqp/v2/go.sum | 18 +-- protocol/amqp/v2/message.go | 2 +- protocol/amqp/v2/options.go | 53 --------- protocol/amqp/v2/protocol.go | 127 ++++++++++----------- protocol/amqp/v2/receiver.go | 11 +- protocol/amqp/v2/sender.go | 15 ++- samples/amqp/go.mod | 4 +- samples/amqp/go.sum | 16 +-- samples/amqp/receiver/main.go | 11 +- samples/amqp/sender/main.go | 8 +- test/integration/amqp/amqp_test.go | 30 ++--- test/integration/amqp_binding/amqp_test.go | 24 ++-- test/integration/go.mod | 26 ++--- test/integration/go.sum | 68 +++++------ 15 files changed, 184 insertions(+), 235 deletions(-) delete mode 100644 protocol/amqp/v2/options.go diff --git a/protocol/amqp/v2/go.mod b/protocol/amqp/v2/go.mod index 21c993d1c..c92bbfdf3 100644 --- a/protocol/amqp/v2/go.mod +++ b/protocol/amqp/v2/go.mod @@ -5,14 +5,14 @@ go 1.18 replace github.com/cloudevents/sdk-go/v2 => ../../../v2 require ( - github.com/Azure/go-amqp v0.17.0 + github.com/Azure/go-amqp v1.0.5 github.com/cloudevents/sdk-go/v2 v2.5.0 - github.com/stretchr/testify v1.8.0 + github.com/stretchr/testify v1.9.0 ) require ( github.com/davecgh/go-spew v1.1.1 // indirect - github.com/google/go-cmp v0.5.1 // indirect + github.com/google/go-cmp v0.5.9 // indirect github.com/json-iterator/go v1.1.10 // indirect github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421 // indirect github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742 // indirect diff --git a/protocol/amqp/v2/go.sum b/protocol/amqp/v2/go.sum index ad989e1f3..b1abf31db 100644 --- a/protocol/amqp/v2/go.sum +++ b/protocol/amqp/v2/go.sum @@ -1,12 +1,11 @@ -github.com/Azure/go-amqp v0.17.0 h1:HHXa3149nKrI0IZwyM7DRcRy5810t9ZICDutn4BYzj4= -github.com/Azure/go-amqp v0.17.0/go.mod h1:9YJ3RhxRT1gquYnzpZO1vcYMMpAdJT+QEg6fwmw9Zlg= +github.com/Azure/go-amqp v1.0.5 h1:po5+ljlcNSU8xtapHTe8gIc8yHxCzC03E8afH2g1ftU= +github.com/Azure/go-amqp v1.0.5/go.mod h1:vZAogwdrkbyK3Mla8m/CxSc/aKdnTZ4IbPxl51Y5WZE= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/fortytw2/leaktest v1.3.0 h1:u8491cBMTQ8ft8aeV+adlcytMZylmA5nnwwkRZjI8vw= -github.com/fortytw2/leaktest v1.3.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g= -github.com/google/go-cmp v0.5.1 h1:JFrFEBb2xKufg6XkJsJr+WbKb4FQlURi5RUcBveYu9k= -github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= +github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/json-iterator/go v1.1.10 h1:Kz6Cvnvv2wGdaG/V8yMvfkmNiXq9Ya2KUv4rouJJr68= github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= @@ -19,18 +18,13 @@ github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWb github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.8.0 h1:pSgiaMZlXftHpm5L7V1+rVB+AZJydKsMxsQBIJw4PKk= -github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= +github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= go.uber.org/atomic v1.4.0 h1:cxzIVoETapQEqDhQu3QfnvXAV4AlzcvUCxkVUFw3+EU= go.uber.org/multierr v1.1.0 h1:HoEmRHQPVSqub6w2z2d2EOVs2fjyFRGyofhKuyDq0QI= go.uber.org/zap v1.10.0 h1:ORx85nbTijNz8ljznvCMR1ZBIPKFn3jQrag10X2AsuM= -golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4= -golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f h1:BLraFXnmrev5lT+xlilqcH8XK9/i0At2xKjWk4p6zsU= -gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/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= diff --git a/protocol/amqp/v2/message.go b/protocol/amqp/v2/message.go index 0756ddfc7..75a4771b4 100644 --- a/protocol/amqp/v2/message.go +++ b/protocol/amqp/v2/message.go @@ -22,7 +22,7 @@ const prefix = "cloudEvents:" // Name prefix for AMQP properties that hold CE at var ( // Use the package path as AMQP error condition name - condition = amqp.ErrorCondition(reflect.TypeOf(Message{}).PkgPath()) + condition = amqp.ErrCond(reflect.TypeOf(Message{}).PkgPath()) specs = spec.WithPrefix(prefix) ) diff --git a/protocol/amqp/v2/options.go b/protocol/amqp/v2/options.go deleted file mode 100644 index 0a465e00e..000000000 --- a/protocol/amqp/v2/options.go +++ /dev/null @@ -1,53 +0,0 @@ -/* - Copyright 2021 The CloudEvents Authors - SPDX-License-Identifier: Apache-2.0 -*/ - -package amqp - -import ( - "github.com/Azure/go-amqp" -) - -// Option is the function signature required to be considered an amqp.Option. -type Option func(*Protocol) error - -// WithConnOpt sets a connection option for amqp -func WithConnOpt(opt amqp.ConnOption) Option { - return func(t *Protocol) error { - t.connOpts = append(t.connOpts, opt) - return nil - } -} - -// WithConnSASLPlain sets SASLPlain connection option for amqp -func WithConnSASLPlain(username, password string) Option { - return WithConnOpt(amqp.ConnSASLPlain(username, password)) -} - -// WithSessionOpt sets a session option for amqp -func WithSessionOpt(opt amqp.SessionOption) Option { - return func(t *Protocol) error { - t.sessionOpts = append(t.sessionOpts, opt) - return nil - } -} - -// WithSenderLinkOption sets a link option for amqp -func WithSenderLinkOption(opt amqp.LinkOption) Option { - return func(t *Protocol) error { - t.senderLinkOpts = append(t.senderLinkOpts, opt) - return nil - } -} - -// WithReceiverLinkOption sets a link option for amqp -func WithReceiverLinkOption(opt amqp.LinkOption) Option { - return func(t *Protocol) error { - t.receiverLinkOpts = append(t.receiverLinkOpts, opt) - return nil - } -} - -// SenderOptionFunc is the type of amqp.Sender options -type SenderOptionFunc func(sender *sender) diff --git a/protocol/amqp/v2/protocol.go b/protocol/amqp/v2/protocol.go index ec3ff1256..5ac8ecd92 100644 --- a/protocol/amqp/v2/protocol.go +++ b/protocol/amqp/v2/protocol.go @@ -15,13 +15,8 @@ import ( ) type Protocol struct { - connOpts []amqp.ConnOption - sessionOpts []amqp.SessionOption - senderLinkOpts []amqp.LinkOption - receiverLinkOpts []amqp.LinkOption - // AMQP - Client *amqp.Client + Client *amqp.Conn Session *amqp.Session ownedClient bool Node string @@ -35,54 +30,60 @@ type Protocol struct { } // NewProtocolFromClient creates a new amqp transport. -func NewProtocolFromClient(client *amqp.Client, session *amqp.Session, queue string, opts ...Option) (*Protocol, error) { +func NewProtocolFromClient( + ctx context.Context, + client *amqp.Conn, + session *amqp.Session, + queue string, + senderOptions *amqp.SenderOptions, + receiverOptions *amqp.ReceiverOptions, +) (*Protocol, error) { t := &Protocol{ - Node: queue, - senderLinkOpts: []amqp.LinkOption(nil), - receiverLinkOpts: []amqp.LinkOption(nil), - Client: client, - Session: session, - } - if err := t.applyOptions(opts...); err != nil { - return nil, err + Node: queue, + Client: client, + Session: session, } - t.senderLinkOpts = append(t.senderLinkOpts, amqp.LinkTargetAddress(queue)) - // Create a sender - amqpSender, err := session.NewSender(t.senderLinkOpts...) + amqpSender, err := session.NewSender(ctx, queue, senderOptions) if err != nil { _ = client.Close() _ = session.Close(context.Background()) return nil, err } - t.Sender = NewSender(amqpSender).(*sender) + t.Sender = NewSender(amqpSender, &amqp.SendOptions{}).(*sender) t.SenderContextDecorators = []func(context.Context) context.Context{} - t.receiverLinkOpts = append(t.receiverLinkOpts, amqp.LinkSourceAddress(t.Node)) - amqpReceiver, err := t.Session.NewReceiver(t.receiverLinkOpts...) + amqpReceiver, err := t.Session.NewReceiver(ctx, t.Node, receiverOptions) if err != nil { return nil, err } - t.Receiver = NewReceiver(amqpReceiver).(*receiver) + t.Receiver = NewReceiver(amqpReceiver, &amqp.ReceiveOptions{}).(*receiver) return t, nil } // NewProtocol creates a new amqp transport. -func NewProtocol(server, queue string, connOption []amqp.ConnOption, sessionOption []amqp.SessionOption, opts ...Option) (*Protocol, error) { - client, err := amqp.Dial(server, connOption...) +func NewProtocol( + ctx context.Context, + server, queue string, + connOptions *amqp.ConnOptions, + sessionOptions *amqp.SessionOptions, + senderOptions *amqp.SenderOptions, + receiverOptions *amqp.ReceiverOptions, +) (*Protocol, error) { + client, err := amqp.Dial(ctx, server, connOptions) if err != nil { return nil, err } // Open a session - session, err := client.NewSession(sessionOption...) + session, err := client.NewSession(ctx, sessionOptions) if err != nil { _ = client.Close() return nil, err } - p, err := NewProtocolFromClient(client, session, queue, opts...) + p, err := NewProtocolFromClient(ctx, client, session, queue, senderOptions, receiverOptions) if err != nil { return nil, err } @@ -92,69 +93,70 @@ func NewProtocol(server, queue string, connOption []amqp.ConnOption, sessionOpti } // NewSenderProtocolFromClient creates a new amqp sender transport. -func NewSenderProtocolFromClient(client *amqp.Client, session *amqp.Session, address string, opts ...Option) (*Protocol, error) { +func NewSenderProtocolFromClient( + ctx context.Context, + client *amqp.Conn, + session *amqp.Session, + address string, + senderOptions *amqp.SenderOptions, +) (*Protocol, error) { t := &Protocol{ - Node: address, - senderLinkOpts: []amqp.LinkOption(nil), - receiverLinkOpts: []amqp.LinkOption(nil), - Client: client, - Session: session, + Node: address, + Client: client, + Session: session, } - if err := t.applyOptions(opts...); err != nil { - return nil, err - } - t.senderLinkOpts = append(t.senderLinkOpts, amqp.LinkTargetAddress(address)) + // Create a sender - amqpSender, err := session.NewSender(t.senderLinkOpts...) + amqpSender, err := session.NewSender(ctx, address, senderOptions) if err != nil { _ = client.Close() _ = session.Close(context.Background()) return nil, err } - t.Sender = NewSender(amqpSender).(*sender) + t.Sender = NewSender(amqpSender, &amqp.SendOptions{}).(*sender) t.SenderContextDecorators = []func(context.Context) context.Context{} return t, nil } // NewReceiverProtocolFromClient creates a new receiver amqp transport. -func NewReceiverProtocolFromClient(client *amqp.Client, session *amqp.Session, address string, opts ...Option) (*Protocol, error) { +func NewReceiverProtocolFromClient( + ctx context.Context, + client *amqp.Conn, + session *amqp.Session, + address string, + receiverOptions *amqp.ReceiverOptions, +) (*Protocol, error) { t := &Protocol{ - Node: address, - senderLinkOpts: []amqp.LinkOption(nil), - receiverLinkOpts: []amqp.LinkOption(nil), - Client: client, - Session: session, - } - if err := t.applyOptions(opts...); err != nil { - return nil, err + Node: address, + Client: client, + Session: session, } t.Node = address - t.receiverLinkOpts = append(t.receiverLinkOpts, amqp.LinkSourceAddress(address)) - amqpReceiver, err := t.Session.NewReceiver(t.receiverLinkOpts...) + amqpReceiver, err := t.Session.NewReceiver(ctx, address, receiverOptions) if err != nil { return nil, err } - t.Receiver = NewReceiver(amqpReceiver).(*receiver) + t.Receiver = NewReceiver(amqpReceiver, &amqp.ReceiveOptions{}).(*receiver) return t, nil } // NewSenderProtocol creates a new sender amqp transport. -func NewSenderProtocol(server, address string, connOption []amqp.ConnOption, sessionOption []amqp.SessionOption, opts ...Option) (*Protocol, error) { - client, err := amqp.Dial(server, connOption...) +func NewSenderProtocol(ctx context.Context, server, address string, connOptions *amqp.ConnOptions, sessionOptions *amqp.SessionOptions, senderOptions *amqp.SenderOptions) (*Protocol, error) { + client, err := amqp.Dial(ctx, server, connOptions) if err != nil { return nil, err } // Open a session - session, err := client.NewSession(sessionOption...) + session, err := client.NewSession(ctx, sessionOptions) if err != nil { _ = client.Close() return nil, err } - p, err := NewSenderProtocolFromClient(client, session, address, opts...) + p, err := NewSenderProtocolFromClient(ctx, client, session, address, senderOptions) if err != nil { return nil, err } @@ -164,20 +166,20 @@ func NewSenderProtocol(server, address string, connOption []amqp.ConnOption, ses } // NewReceiverProtocol creates a new receiver amqp transport. -func NewReceiverProtocol(server, address string, connOption []amqp.ConnOption, sessionOption []amqp.SessionOption, opts ...Option) (*Protocol, error) { - client, err := amqp.Dial(server, connOption...) +func NewReceiverProtocol(ctx context.Context, server, address string, connOptions *amqp.ConnOptions, sessionOptions *amqp.SessionOptions, receiverOptions *amqp.ReceiverOptions) (*Protocol, error) { + client, err := amqp.Dial(ctx, server, connOptions) if err != nil { return nil, err } // Open a session - session, err := client.NewSession(sessionOption...) + session, err := client.NewSession(ctx, sessionOptions) if err != nil { _ = client.Close() return nil, err } - p, err := NewReceiverProtocolFromClient(client, session, address, opts...) + p, err := NewReceiverProtocolFromClient(ctx, client, session, address, receiverOptions) if err != nil { return nil, err @@ -187,15 +189,6 @@ func NewReceiverProtocol(server, address string, connOption []amqp.ConnOption, s return p, nil } -func (t *Protocol) applyOptions(opts ...Option) error { - for _, fn := range opts { - if err := fn(t); err != nil { - return err - } - } - return nil -} - func (t *Protocol) Close(ctx context.Context) (err error) { if t.ownedClient { // Closing the client will close at cascade sender and receiver diff --git a/protocol/amqp/v2/receiver.go b/protocol/amqp/v2/receiver.go index 601d99f92..fb0922eb3 100644 --- a/protocol/amqp/v2/receiver.go +++ b/protocol/amqp/v2/receiver.go @@ -19,10 +19,13 @@ import ( const serverDown = "session ended by server" // receiver wraps an amqp.Receiver as a binding.Receiver -type receiver struct{ amqp *amqp.Receiver } +type receiver struct { + amqp *amqp.Receiver + options *amqp.ReceiveOptions +} func (r *receiver) Receive(ctx context.Context) (binding.Message, error) { - m, err := r.amqp.Receive(ctx) + m, err := r.amqp.Receive(ctx, r.options) if err != nil { if err == ctx.Err() { return nil, io.EOF @@ -38,6 +41,6 @@ func (r *receiver) Receive(ctx context.Context) (binding.Message, error) { } // NewReceiver create a new Receiver which wraps an amqp.Receiver in a binding.Receiver -func NewReceiver(amqp *amqp.Receiver) protocol.Receiver { - return &receiver{amqp: amqp} +func NewReceiver(amqp *amqp.Receiver, options *amqp.ReceiveOptions) protocol.Receiver { + return &receiver{amqp: amqp, options: options} } diff --git a/protocol/amqp/v2/sender.go b/protocol/amqp/v2/sender.go index 7ac4c0a0a..320f61051 100644 --- a/protocol/amqp/v2/sender.go +++ b/protocol/amqp/v2/sender.go @@ -16,14 +16,15 @@ import ( // sender wraps an amqp.Sender as a binding.Sender type sender struct { - amqp *amqp.Sender + amqp *amqp.Sender + options *amqp.SendOptions } func (s *sender) Send(ctx context.Context, in binding.Message, transformers ...binding.Transformer) error { var err error defer func() { _ = in.Finish(err) }() if m, ok := in.(*Message); ok { // Already an AMQP message. - err = s.amqp.Send(ctx, m.AMQP) + err = s.amqp.Send(ctx, m.AMQP, s.options) return err } @@ -33,15 +34,13 @@ func (s *sender) Send(ctx context.Context, in binding.Message, transformers ...b return err } - err = s.amqp.Send(ctx, &amqpMessage) + err = s.amqp.Send(ctx, &amqpMessage, s.options) return err } // NewSender creates a new Sender which wraps an amqp.Sender in a binding.Sender -func NewSender(amqpSender *amqp.Sender, options ...SenderOptionFunc) protocol.Sender { - s := &sender{amqp: amqpSender} - for _, o := range options { - o(s) - } +func NewSender(amqpSender *amqp.Sender, options *amqp.SendOptions) protocol.Sender { + s := &sender{amqp: amqpSender, options: options} + return s } diff --git a/samples/amqp/go.mod b/samples/amqp/go.mod index 43e39528f..adaa07f58 100644 --- a/samples/amqp/go.mod +++ b/samples/amqp/go.mod @@ -3,10 +3,10 @@ module github.com/cloudevents/sdk-go/samples/amqp go 1.18 require ( - github.com/Azure/go-amqp v0.17.0 + github.com/Azure/go-amqp v1.0.5 github.com/cloudevents/sdk-go/protocol/amqp/v2 v2.5.0 github.com/cloudevents/sdk-go/v2 v2.5.0 - github.com/google/uuid v1.1.1 + github.com/google/uuid v1.6.0 ) require ( diff --git a/samples/amqp/go.sum b/samples/amqp/go.sum index 1aae546cc..16314794f 100644 --- a/samples/amqp/go.sum +++ b/samples/amqp/go.sum @@ -1,15 +1,13 @@ -github.com/Azure/go-amqp v0.17.0 h1:HHXa3149nKrI0IZwyM7DRcRy5810t9ZICDutn4BYzj4= -github.com/Azure/go-amqp v0.17.0/go.mod h1:9YJ3RhxRT1gquYnzpZO1vcYMMpAdJT+QEg6fwmw9Zlg= +github.com/Azure/go-amqp v1.0.5 h1:po5+ljlcNSU8xtapHTe8gIc8yHxCzC03E8afH2g1ftU= +github.com/Azure/go-amqp v1.0.5/go.mod h1:vZAogwdrkbyK3Mla8m/CxSc/aKdnTZ4IbPxl51Y5WZE= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/fortytw2/leaktest v1.3.0 h1:u8491cBMTQ8ft8aeV+adlcytMZylmA5nnwwkRZjI8vw= -github.com/fortytw2/leaktest v1.3.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g= -github.com/google/go-cmp v0.5.1 h1:JFrFEBb2xKufg6XkJsJr+WbKb4FQlURi5RUcBveYu9k= -github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/uuid v1.1.1 h1:Gkbcsh/GbpXz7lPftLA3P6TYMwjCLYm83jiFQZF/3gY= -github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +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/json-iterator/go v1.1.10 h1:Kz6Cvnvv2wGdaG/V8yMvfkmNiXq9Ya2KUv4rouJJr68= github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421 h1:ZqeYNhU3OHLH3mGKHDcjJRFFRrJa6eAM5H+CtDdOsPc= @@ -21,7 +19,7 @@ github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZb github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= 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.8.0 h1:pSgiaMZlXftHpm5L7V1+rVB+AZJydKsMxsQBIJw4PKk= +github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw= go.uber.org/atomic v1.4.0 h1:cxzIVoETapQEqDhQu3QfnvXAV4AlzcvUCxkVUFw3+EU= go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= @@ -30,6 +28,4 @@ go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/ go.uber.org/zap v1.10.0 h1:ORx85nbTijNz8ljznvCMR1ZBIPKFn3jQrag10X2AsuM= go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= golang.org/x/time v0.0.0-20210723032227-1f47c861a9ac h1:7zkz7BUtwNFFqcowJ+RIgu2MaV/MapERkDIy+mwPyjs= -golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4= -golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= diff --git a/samples/amqp/receiver/main.go b/samples/amqp/receiver/main.go index f446b3c97..22b199ae4 100644 --- a/samples/amqp/receiver/main.go +++ b/samples/amqp/receiver/main.go @@ -21,7 +21,7 @@ import ( // Parse AMQP_URL env variable. Return server URL, AMQP node (from path) and SASLPlain // option if user/pass are present. -func sampleConfig() (server, node string, opts []ceamqp.Option) { +func sampleConfig() (server, node string, opts *amqp.ConnOptions) { env := os.Getenv("AMQP_URL") if env == "" { env = "/test" @@ -30,17 +30,22 @@ func sampleConfig() (server, node string, opts []ceamqp.Option) { if err != nil { log.Fatal(err) } + if u.User != nil { user := u.User.Username() pass, _ := u.User.Password() - opts = append(opts, ceamqp.WithConnOpt(amqp.ConnSASLPlain(user, pass))) + + opts = &amqp.ConnOptions{ + SASLType: amqp.SASLTypePlain(user, pass), + } } return env, strings.TrimPrefix(u.Path, "/"), opts } func main() { host, node, opts := sampleConfig() - p, err := ceamqp.NewProtocol(host, node, []amqp.ConnOption{}, []amqp.SessionOption{}, opts...) + p, err := ceamqp.NewProtocol(context.Background(), host, node, opts, &amqp.SessionOptions{}, + &amqp.SenderOptions{}, &amqp.ReceiverOptions{}) if err != nil { log.Fatalf("Failed to create AMQP protocol: %v", err) } diff --git a/samples/amqp/sender/main.go b/samples/amqp/sender/main.go index 97925d5ab..c84d3530c 100644 --- a/samples/amqp/sender/main.go +++ b/samples/amqp/sender/main.go @@ -26,7 +26,7 @@ const ( // Parse AMQP_URL env variable. Return server URL, AMQP node (from path) and SASLPlain // option if user/pass are present. -func sampleConfig() (server, node string, opts []ceamqp.Option) { +func sampleConfig() (server, node string, opts *amqp.ConnOptions) { env := os.Getenv("AMQP_URL") if env == "" { env = "/test" @@ -38,7 +38,9 @@ func sampleConfig() (server, node string, opts []ceamqp.Option) { if u.User != nil { user := u.User.Username() pass, _ := u.User.Password() - opts = append(opts, ceamqp.WithConnOpt(amqp.ConnSASLPlain(user, pass))) + opts = &amqp.ConnOptions{ + SASLType: amqp.SASLTypePlain(user, pass), + } } return env, strings.TrimPrefix(u.Path, "/"), opts } @@ -51,7 +53,7 @@ type Example struct { func main() { host, node, opts := sampleConfig() - p, err := ceamqp.NewProtocol(host, node, []amqp.ConnOption{}, []amqp.SessionOption{}, opts...) + p, err := ceamqp.NewProtocol(context.Background(), host, node, opts, &amqp.SessionOptions{}, &amqp.SenderOptions{}, &amqp.ReceiverOptions{}) if err != nil { log.Fatalf("Failed to create amqp protocol: %v", err) } diff --git a/test/integration/amqp/amqp_test.go b/test/integration/amqp/amqp_test.go index b700e1182..82d31a82e 100644 --- a/test/integration/amqp/amqp_test.go +++ b/test/integration/amqp/amqp_test.go @@ -6,18 +6,17 @@ package amqp import ( + "context" "net/url" "os" "testing" "github.com/Azure/go-amqp" - - "github.com/stretchr/testify/require" - protocolamqp "github.com/cloudevents/sdk-go/protocol/amqp/v2" clienttest "github.com/cloudevents/sdk-go/v2/client/test" "github.com/cloudevents/sdk-go/v2/event" "github.com/cloudevents/sdk-go/v2/test" + "github.com/stretchr/testify/require" ) func TestSendEvent(t *testing.T) { @@ -46,18 +45,18 @@ func TestSenderReceiverEvent(t *testing.T) { } func senderProtocolFactory(t *testing.T) *protocolamqp.Protocol { - c, ss, a := testClient(t) + c, ss, a, so, _ := testClient(t) - p, err := protocolamqp.NewSenderProtocolFromClient(c, ss, a) + p, err := protocolamqp.NewSenderProtocolFromClient(context.Background(), c, ss, a, so) require.NoError(t, err) return p } func receiverProtocolFactory(t *testing.T) *protocolamqp.Protocol { - c, ss, a := testClient(t) + c, ss, a, _, ro := testClient(t) - p, err := protocolamqp.NewReceiverProtocolFromClient(c, ss, a) + p, err := protocolamqp.NewReceiverProtocolFromClient(context.Background(), c, ss, a, ro) require.NoError(t, err) return p @@ -70,26 +69,31 @@ func receiverProtocolFactory(t *testing.T) *protocolamqp.Protocol { // On option is http://qpid.apache.org/components/dispatch-router/indexthtml. // It can be installed from source or from RPMs, see https://qpid.apache.org/packages.html // Run `qdrouterd` and the tests will work with no further config. -func testClient(t *testing.T) (client *amqp.Client, session *amqp.Session, addr string) { +func testClient(t *testing.T) (client *amqp.Conn, session *amqp.Session, addr string, + senderOpts *amqp.SenderOptions, receiverOpts *amqp.ReceiverOptions) { t.Helper() addr = "test" s := os.Getenv("TEST_AMQP_URL") if u, err := url.Parse(s); err == nil && u.Path != "" { addr = u.Path } - client, err := amqp.Dial(s) + client, err := amqp.Dial(context.Background(), s, &amqp.ConnOptions{}) if err != nil { t.Skipf("ampq.Dial(%#v): %v", s, err) } - session, err = client.NewSession() + session, err = client.NewSession(context.Background(), &amqp.SessionOptions{}) require.NoError(t, err) - return client, session, addr + senderOpts = &amqp.SenderOptions{} + require.NotNil(t, senderOpts) + receiverOpts = &amqp.ReceiverOptions{} + require.NotNil(t, receiverOpts) + return client, session, addr, senderOpts, receiverOpts } func protocolFactory(t *testing.T) *protocolamqp.Protocol { - c, ss, a := testClient(t) + c, ss, a, so, ro := testClient(t) - p, err := protocolamqp.NewProtocolFromClient(c, ss, a) + p, err := protocolamqp.NewProtocolFromClient(context.Background(), c, ss, a, so, ro) require.NoError(t, err) return p diff --git a/test/integration/amqp_binding/amqp_test.go b/test/integration/amqp_binding/amqp_test.go index 28a3e03a3..454f11366 100644 --- a/test/integration/amqp_binding/amqp_test.go +++ b/test/integration/amqp_binding/amqp_test.go @@ -90,29 +90,35 @@ func TestSendEventReceiveBinary(t *testing.T) { // On option is http://qpid.apache.org/components/dispatch-router/indexthtml. // It can be installed from source or from RPMs, see https://qpid.apache.org/packages.html // Run `qdrouterd` and the tests will work with no further config. -func testClient(t testing.TB) (client *amqp.Client, session *amqp.Session, addr string) { +func testClient(t testing.TB) (client *amqp.Conn, session *amqp.Session, addr string, + senderOpts *amqp.SenderOptions, receiverOpts *amqp.ReceiverOptions) { t.Helper() addr = "test" s := os.Getenv("TEST_AMQP_URL") if u, err := url.Parse(s); err == nil && u.Path != "" { addr = u.Path } - client, err := amqp.Dial(s) + client, err := amqp.Dial(context.Background(), s, &amqp.ConnOptions{}) if err != nil { t.Skipf("ampq.Dial(%#v): %v", s, err) } - session, err = client.NewSession() + session, err = client.NewSession(context.Background(), &amqp.SessionOptions{}) require.NoError(t, err) - return client, session, addr + senderOpts = &amqp.SenderOptions{} + require.NotNil(t, senderOpts) + receiverOpts = &amqp.ReceiverOptions{} + require.NotNil(t, receiverOpts) + return client, session, addr, senderOpts, receiverOpts + } -func testSenderReceiver(t testing.TB, senderOptions ...protocolamqp.SenderOptionFunc) (io.Closer, bindings.Sender, bindings.Receiver) { - c, ss, a := testClient(t) - r, err := ss.NewReceiver(amqp.LinkSourceAddress(a)) +func testSenderReceiver(t testing.TB) (io.Closer, bindings.Sender, bindings.Receiver) { + c, ss, a, so, ro := testClient(t) + r, err := ss.NewReceiver(context.Background(), a, ro) require.NoError(t, err) - s, err := ss.NewSender(amqp.LinkTargetAddress(a)) + s, err := ss.NewSender(context.Background(), a, so) require.NoError(t, err) - return c, protocolamqp.NewSender(s, senderOptions...), protocolamqp.NewReceiver(r) + return c, protocolamqp.NewSender(s, &amqp.SendOptions{}), protocolamqp.NewReceiver(r, &amqp.ReceiveOptions{}) } func BenchmarkSendReceive(b *testing.B) { diff --git a/test/integration/go.mod b/test/integration/go.mod index b80046249..4e4d332eb 100644 --- a/test/integration/go.mod +++ b/test/integration/go.mod @@ -21,8 +21,8 @@ replace github.com/cloudevents/sdk-go/protocol/mqtt_paho/v2 => ../../protocol/mq replace github.com/cloudevents/sdk-go/protocol/kafka_confluent/v2 => ../../protocol/kafka_confluent/v2 require ( - github.com/Azure/go-amqp v0.17.0 - github.com/IBM/sarama v1.40.1 + github.com/Azure/go-amqp v1.0.5 + github.com/IBM/sarama v1.43.1 github.com/cloudevents/sdk-go/protocol/amqp/v2 v2.5.0 github.com/cloudevents/sdk-go/protocol/kafka_confluent/v2 v2.0.0-00010101000000-000000000000 github.com/cloudevents/sdk-go/protocol/kafka_sarama/v2 v2.5.0 @@ -34,17 +34,17 @@ require ( github.com/confluentinc/confluent-kafka-go/v2 v2.3.0 github.com/eclipse/paho.golang v0.12.0 github.com/google/go-cmp v0.6.0 - github.com/google/uuid v1.3.0 - github.com/nats-io/nats.go v1.31.0 + github.com/google/uuid v1.6.0 + github.com/nats-io/nats.go v1.34.1 github.com/nats-io/stan.go v0.10.4 - github.com/stretchr/testify v1.8.4 - go.uber.org/atomic v1.4.0 + github.com/stretchr/testify v1.9.0 + go.uber.org/atomic v1.11.0 ) require ( github.com/davecgh/go-spew v1.1.1 // indirect - github.com/eapache/go-resiliency v1.3.0 // indirect - github.com/eapache/go-xerial-snappy v0.0.0-20230111030713-bf00bc1b83b6 // indirect + github.com/eapache/go-resiliency v1.6.0 // indirect + github.com/eapache/go-xerial-snappy v0.0.0-20230731223053-c322873962e3 // indirect github.com/eapache/queue v1.1.0 // indirect github.com/gogo/protobuf v1.3.2 // indirect github.com/golang/snappy v0.0.4 // indirect @@ -58,19 +58,19 @@ require ( github.com/jcmturner/aescts/v2 v2.0.0 // indirect github.com/jcmturner/dnsutils/v2 v2.0.0 // indirect github.com/jcmturner/gofork v1.7.6 // indirect - github.com/jcmturner/gokrb5/v8 v8.4.3 // indirect + github.com/jcmturner/gokrb5/v8 v8.4.4 // indirect github.com/jcmturner/rpc/v2 v2.0.3 // indirect github.com/json-iterator/go v1.1.12 // indirect - github.com/klauspost/compress v1.17.2 // indirect + github.com/klauspost/compress v1.17.7 // indirect github.com/mattn/go-colorable v0.1.13 // indirect github.com/mattn/go-isatty v0.0.16 // indirect github.com/minio/highwayhash v1.0.2 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect github.com/nats-io/jwt/v2 v2.2.1-0.20220113022732-58e87895b296 // indirect - github.com/nats-io/nkeys v0.4.6 // indirect + github.com/nats-io/nkeys v0.4.7 // indirect github.com/nats-io/nuid v1.0.1 // indirect - github.com/pierrec/lz4/v4 v4.1.17 // indirect + github.com/pierrec/lz4/v4 v4.1.21 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect github.com/prometheus/procfs v0.8.0 // indirect github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 // indirect @@ -79,7 +79,7 @@ require ( go.uber.org/zap v1.10.0 // indirect golang.org/x/crypto v0.21.0 // indirect golang.org/x/net v0.23.0 // indirect - golang.org/x/sync v0.4.0 // indirect + golang.org/x/sync v0.6.0 // indirect golang.org/x/sys v0.18.0 // indirect golang.org/x/time v0.0.0-20211116232009-f0f3c7e86c11 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect diff --git a/test/integration/go.sum b/test/integration/go.sum index 422913dd6..a82a0ef08 100644 --- a/test/integration/go.sum +++ b/test/integration/go.sum @@ -1,12 +1,11 @@ -github.com/Azure/go-amqp v0.17.0 h1:HHXa3149nKrI0IZwyM7DRcRy5810t9ZICDutn4BYzj4= -github.com/Azure/go-amqp v0.17.0/go.mod h1:9YJ3RhxRT1gquYnzpZO1vcYMMpAdJT+QEg6fwmw9Zlg= +github.com/Azure/go-amqp v1.0.5 h1:po5+ljlcNSU8xtapHTe8gIc8yHxCzC03E8afH2g1ftU= +github.com/Azure/go-amqp v1.0.5/go.mod h1:vZAogwdrkbyK3Mla8m/CxSc/aKdnTZ4IbPxl51Y5WZE= github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1 h1:UQHMgLO+TxOElx5B5HZ4hJQsoJ/PvUvKRhJHDQXO8P8= github.com/DataDog/datadog-go v2.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= -github.com/IBM/sarama v1.40.1 h1:lL01NNg/iBeigUbT+wpPysuTYW6roHo6kc1QrffRf0k= -github.com/IBM/sarama v1.40.1/go.mod h1:+5OFwA5Du9I6QrznhaMHsuwWdWZNMjaBSIxEWEgKOYE= +github.com/IBM/sarama v1.43.1 h1:Z5uz65Px7f4DhI/jQqEm/tV9t8aU+JUdTyW/K/fCXpA= +github.com/IBM/sarama v1.43.1/go.mod h1:GG5q1RURtDNPz8xxJs3mgX6Ytak8Z9eLhAkJPObe2xE= github.com/Microsoft/go-winio v0.5.2 h1:a9IhgEQBCUEk6QCdml9CiJGhAws+YwffDHEMp1VMrpA= github.com/Microsoft/hcsshim v0.9.4 h1:mnUj0ivWy6UzbB1uLFqKR6F+ZyiDc7j4iGgHTpO+5+I= -github.com/Shopify/toxiproxy/v2 v2.5.0 h1:i4LPT+qrSlKNtQf5QliVjdP08GyAH8+BUIc9gT0eahc= github.com/armon/go-metrics v0.0.0-20190430140413-ec5e00d3c878 h1:EFSB7Zo9Eg91v7MJPVsifUysc/wPdN+NOnVe6bWbdBM= github.com/armon/go-metrics v0.0.0-20190430140413-ec5e00d3c878/go.mod h1:3AMJUQhVx52RsWOnlkpikZr01T/yAVN2gn0861vByNg= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= @@ -24,10 +23,10 @@ github.com/docker/distribution v2.8.1+incompatible h1:Q50tZOPR6T/hjNsyc9g8/syEs6 github.com/docker/docker v20.10.17+incompatible h1:JYCuMrWaVNophQTOrMMoSwudOVEfcegoZZrleKc1xwE= github.com/docker/go-connections v0.4.0 h1:El9xVISelRB7BuFusrZozjnkIM5YnzCViNKohAFqRJQ= github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4= -github.com/eapache/go-resiliency v1.3.0 h1:RRL0nge+cWGlxXbUzJ7yMcq6w2XBEr19dCN6HECGaT0= -github.com/eapache/go-resiliency v1.3.0/go.mod h1:5yPzW0MIvSe0JDsv0v+DvcjEv2FyD6iZYSs1ZI+iQho= -github.com/eapache/go-xerial-snappy v0.0.0-20230111030713-bf00bc1b83b6 h1:8yY/I9ndfrgrXUbOGObLHKBR4Fl3nZXwM2c7OYTT8hM= -github.com/eapache/go-xerial-snappy v0.0.0-20230111030713-bf00bc1b83b6/go.mod h1:YvSRo5mw33fLEx1+DlK6L2VV43tJt5Eyel9n9XBcR+0= +github.com/eapache/go-resiliency v1.6.0 h1:CqGDTLtpwuWKn6Nj3uNUdflaq+/kIPsg0gfNzHton30= +github.com/eapache/go-resiliency v1.6.0/go.mod h1:5yPzW0MIvSe0JDsv0v+DvcjEv2FyD6iZYSs1ZI+iQho= +github.com/eapache/go-xerial-snappy v0.0.0-20230731223053-c322873962e3 h1:Oy0F4ALJ04o5Qqpdz8XLIpNA3WM/iSIXqxtqo7UGVws= +github.com/eapache/go-xerial-snappy v0.0.0-20230731223053-c322873962e3/go.mod h1:YvSRo5mw33fLEx1+DlK6L2VV43tJt5Eyel9n9XBcR+0= github.com/eapache/queue v1.1.0 h1:YOEu7KNc61ntiQlcEeUIoDTJ2o8mQznoNvUhiigpIqc= github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFPTqq+I= github.com/eclipse/paho.golang v0.12.0 h1:EXQFJbJklDnUqW6lyAknMWRhM2NgpHxwrrL8riUmp3Q= @@ -35,7 +34,6 @@ github.com/eclipse/paho.golang v0.12.0/go.mod h1:TSDCUivu9JnoR9Hl+H7sQMcHkejWH2/ github.com/fatih/color v1.7.0 h1:DkWD4oS2D8LGGgTQ6IvwJJXSL5Vp2ffcQg58nFV38Ys= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= github.com/fortytw2/leaktest v1.3.0 h1:u8491cBMTQ8ft8aeV+adlcytMZylmA5nnwwkRZjI8vw= -github.com/fortytw2/leaktest v1.3.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= @@ -43,12 +41,11 @@ github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5y github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= 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.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= -github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +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/gorilla/securecookie v1.1.1/go.mod h1:ra0sb63/xPlUeL+yeDciTfxMRAA+MP+HVt/4epWDjd4= github.com/gorilla/sessions v1.2.1/go.mod h1:dk2InVEVJ0sfLlnXv9EAgkf6ecYs/i80K/zI+bUmuGM= github.com/hashicorp/errwrap v1.0.0 h1:hLrqtEDnRye3+sgx6z4qVLNuviH3MR5aQ0ykNJa/UYA= @@ -82,16 +79,16 @@ github.com/jcmturner/gofork v1.7.6 h1:QH0l3hzAU1tfT3rZCnW5zXl+orbkNMMRGJfdJjHVET github.com/jcmturner/gofork v1.7.6/go.mod h1:1622LH6i/EZqLloHfE7IeZ0uEJwMSUyQ/nDd82IeqRo= github.com/jcmturner/goidentity/v6 v6.0.1 h1:VKnZd2oEIMorCTsFBnJWbExfNN7yZr3EhJAxwOkZg6o= github.com/jcmturner/goidentity/v6 v6.0.1/go.mod h1:X1YW3bgtvwAXju7V3LCIMpY0Gbxyjn/mY9zx4tFonSg= -github.com/jcmturner/gokrb5/v8 v8.4.3 h1:iTonLeSJOn7MVUtyMT+arAn5AKAPrkilzhGw8wE/Tq8= -github.com/jcmturner/gokrb5/v8 v8.4.3/go.mod h1:dqRwJGXznQrzw6cWmyo6kH+E7jksEQG/CyVWsJEsJO0= +github.com/jcmturner/gokrb5/v8 v8.4.4 h1:x1Sv4HaTpepFkXbt2IkL29DXRf8sOfZXo8eRKh687T8= +github.com/jcmturner/gokrb5/v8 v8.4.4/go.mod h1:1btQEpgT6k+unzCwX1KdWMEwPPkkgBtP+F6aCACiMrs= github.com/jcmturner/rpc/v2 v2.0.3 h1:7FXXj8Ti1IaVFpSAziCZWNzbNuZmnvw/i6CqLNdWfZY= github.com/jcmturner/rpc/v2 v2.0.3/go.mod h1:VUJYCIDm3PVOEHw8sgt091/20OJjskO/YJki3ELg/Hc= github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= 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.17.2 h1:RlWWUY/Dr4fL8qk9YG7DTZ7PDgME2V4csBXA8L/ixi4= -github.com/klauspost/compress v1.17.2/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE= +github.com/klauspost/compress v1.17.7 h1:ehO88t2UGzQK66LMdE8tibEd1ErmzZjNEqWkjLAKQQg= +github.com/klauspost/compress v1.17.7/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw= github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/magiconair/properties v1.8.6 h1:5ibWZ6iY0NctNGWo87LalDlEZ6R41TqbbDamhfG/Qzo= @@ -119,11 +116,11 @@ github.com/nats-io/jwt/v2 v2.2.1-0.20220113022732-58e87895b296/go.mod h1:0tqz9Hl github.com/nats-io/nats-server/v2 v2.9.23 h1:6Wj6H6QpP9FMlpCyWUaNu2yeZ/qGj+mdRkZ1wbikExU= github.com/nats-io/nats-streaming-server v0.24.3 h1:uZez8jBkXscua++jaDsK7DhpSAkizdetar6yWbPMRco= github.com/nats-io/nats.go v1.22.1/go.mod h1:tLqubohF7t4z3du1QDPYJIQQyhb4wl6DhjxEajSI7UA= -github.com/nats-io/nats.go v1.31.0 h1:/WFBHEc/dOKBF6qf1TZhrdEfTmOZ5JzdJ+Y3m6Y/p7E= -github.com/nats-io/nats.go v1.31.0/go.mod h1:di3Bm5MLsoB4Bx61CBTsxuarI36WbhAwOm8QrW39+i8= +github.com/nats-io/nats.go v1.34.1 h1:syWey5xaNHZgicYBemv0nohUPPmaLteiBEUT6Q5+F/4= +github.com/nats-io/nats.go v1.34.1/go.mod h1:Ubdu4Nh9exXdSz0RVWRFBbRfrbSxOYd26oF0wkWclB8= github.com/nats-io/nkeys v0.3.0/go.mod h1:gvUNGjVcM2IPr5rCsRsC6Wb3Hr2CQAm08dsxtV6A5y4= -github.com/nats-io/nkeys v0.4.6 h1:IzVe95ru2CT6ta874rt9saQRkWfe2nFj1NtvYSLqMzY= -github.com/nats-io/nkeys v0.4.6/go.mod h1:4DxZNzenSVd1cYQoAa8948QY3QDjrHfcfVADymtkpts= +github.com/nats-io/nkeys v0.4.7 h1:RwNJbbIdYCoClSDNY7QVKZlyb/wfT6ugvFCiKy6vDvI= +github.com/nats-io/nkeys v0.4.7/go.mod h1:kqXRgRDPlGy7nGaEDMuYzmiJCIAAWDK0IMBtDmGD0nc= 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/nats-io/stan.go v0.10.4 h1:19GS/eD1SeQJaVkeM9EkvEYattnvnWrZ3wkSWSw4uXw= @@ -132,8 +129,8 @@ github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8 github.com/opencontainers/image-spec v1.0.3-0.20211202183452-c5a74bcca799 h1:rc3tiVYb5z54aKaDfakKn0dDjIyPpTtszkjuMzyt7ec= github.com/opencontainers/runc v1.1.3 h1:vIXrkId+0/J2Ymu2m7VjGvbSlAId9XNRPhn2p4b+d8w= github.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= -github.com/pierrec/lz4/v4 v4.1.17 h1:kV4Ip+/hUBC+8T6+2EgburRtkE9ef4nbY3f4dFhGjMc= -github.com/pierrec/lz4/v4 v4.1.17/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= +github.com/pierrec/lz4/v4 v4.1.21 h1:yOVMLb6qSIDP67pl/5F7RepeKYu/VmTyEXvuMI5d9mQ= +github.com/pierrec/lz4/v4 v4.1.21/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= @@ -150,13 +147,15 @@ github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjR github.com/sirupsen/logrus v1.8.1 h1:dJKuHgqk1NNQlqoA6BTlM1Wf9DOH3NBjQyu0h9+AZZE= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= +github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= -github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= -github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= +github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/testcontainers/testcontainers-go v0.14.0 h1:h0D5GaYG9mhOWr2qHdEKDXpkce/VlvaYOCzTRi6UBi8= github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM= github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw= @@ -166,8 +165,8 @@ github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5t go.etcd.io/bbolt v1.3.6 h1:/ecaJf0sk1l4l6V4awd65v2C3ILy7MSj+s/x1ADCIMU= go.etcd.io/bbolt v1.3.6/go.mod h1:qXsaaIqmgQH0T+OPdb99Bf+PKfBBQVAdyD6TY9G8XM4= go.opencensus.io v0.23.0 h1:gqCw0LfLxScz8irSi8exQc7fyQ0fKQU/qnC/X8+V/1M= -go.uber.org/atomic v1.4.0 h1:cxzIVoETapQEqDhQu3QfnvXAV4AlzcvUCxkVUFw3+EU= -go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= +go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE= +go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= go.uber.org/multierr v1.1.0 h1:HoEmRHQPVSqub6w2z2d2EOVs2fjyFRGyofhKuyDq0QI= go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= go.uber.org/zap v1.10.0 h1:ORx85nbTijNz8ljznvCMR1ZBIPKFn3jQrag10X2AsuM= @@ -177,8 +176,8 @@ golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8U golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210314154223-e6e6c4f2bb5b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.5.0/go.mod h1:NK/OQwhpMQP3MwtdjgLlYHnH9ebylxKWv3e0fK+mkQU= +golang.org/x/crypto v0.6.0/go.mod h1:OFC/31mSvZgRz0V1QTNCzfAI1aIRzbiufJtkMIlEp58= golang.org/x/crypto v0.21.0 h1:X31++rzVUdKhX5sWmSOFZxx8UW/ldWx55cbf08iNAMA= golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= @@ -192,10 +191,10 @@ golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLL 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-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.0.0-20220725212005-46097bf591d3/go.mod h1:AaygXjzTFtRAg2ttMY5RMuhpJ3cNnI0XpyFJD1iQRSM= golang.org/x/net v0.5.0/go.mod h1:DivGGAXEgPSlEBzxGzZI+ZLohi+xUj054jfeKui00ws= +golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= +golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.23.0 h1:7EYJ93RZ9vYSZAIb2x3lnuvqO5zneoD6IvWjuhfxjTs= golang.org/x/net v0.23.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -203,8 +202,8 @@ golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJ 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-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.4.0 h1:zxkM55ReGkDlKSM+Fu41A+zmbZuaPVbGMzvvdUPznYQ= -golang.org/x/sync v0.4.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= +golang.org/x/sync v0.6.0 h1:5BMeUDZ7vkXGfEr1x9B4bRcTH4lpkTkpdh0T/J+qjbQ= +golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20190130150945-aca44879d564/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -213,22 +212,23 @@ golang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200923182605-d9f96fdee20d/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-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= golang.org/x/sys v0.4.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.18.0 h1:DBdB3niSjOA/O0blCZBqDefyWNYveAYMNF1Wum0DYQ4= golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.4.0/go.mod h1:9P2UbLfCdcvo3p/nzKvsmas4TnlujnuoV9hGgYzW1lQ= +golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.6.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/time v0.0.0-20211116232009-f0f3c7e86c11 h1:GZokNIeuVkl3aZHJchRrr13WCsols02MLUcz1U9is6M= golang.org/x/time v0.0.0-20211116232009-f0f3c7e86c11/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=