Signed-off-by: Vasiliy Tolstov <v.tolstov@unistack.org>
This commit is contained in:
Василий Толстов 2021-09-28 23:43:43 +03:00
parent a1999ff81c
commit ecb60e4dc5
31 changed files with 125 additions and 88 deletions

View File

@ -114,8 +114,8 @@ func (m *memoryBroker) Publish(ctx context.Context, topic string, msg *Message,
} }
type msgWrapper struct { type msgWrapper struct {
topic string
body interface{} body interface{}
topic string
} }
func (m *memoryBroker) BatchPublish(ctx context.Context, msgs []*Message, opts ...PublishOption) error { func (m *memoryBroker) BatchPublish(ctx context.Context, msgs []*Message, opts ...PublishOption) error {
@ -180,7 +180,7 @@ func (m *memoryBroker) publish(ctx context.Context, vs []msgWrapper, opts ...Pub
beh = sub.opts.BatchErrorHandler beh = sub.opts.BatchErrorHandler
} }
if beh != nil { if beh != nil {
beh(ms) _ = beh(ms)
} else if m.opts.Logger.V(logger.ErrorLevel) { } else if m.opts.Logger.V(logger.ErrorLevel) {
m.opts.Logger.Error(m.opts.Context, err.Error()) m.opts.Logger.Error(m.opts.Context, err.Error())
} }
@ -199,7 +199,7 @@ func (m *memoryBroker) publish(ctx context.Context, vs []msgWrapper, opts ...Pub
eh = sub.opts.ErrorHandler eh = sub.opts.ErrorHandler
} }
if eh != nil { if eh != nil {
eh(p) _ = eh(p)
} else if m.opts.Logger.V(logger.ErrorLevel) { } else if m.opts.Logger.V(logger.ErrorLevel) {
m.opts.Logger.Error(m.opts.Context, err.Error()) m.opts.Logger.Error(m.opts.Context, err.Error())
} }

View File

@ -53,6 +53,7 @@ func TestMemoryBatchBroker(t *testing.T) {
t.Fatalf("Unexpected connect error %v", err) t.Fatalf("Unexpected connect error %v", err)
} }
} }
func TestMemoryBroker(t *testing.T) { func TestMemoryBroker(t *testing.T) {
b := NewBroker() b := NewBroker()
ctx := context.Background() ctx := context.Background()

View File

@ -13,7 +13,7 @@ var DefaultConfig Config = NewConfig()
// DefaultWatcherMinInterval default min interval for poll changes // DefaultWatcherMinInterval default min interval for poll changes
var DefaultWatcherMinInterval = 5 * time.Second var DefaultWatcherMinInterval = 5 * time.Second
// DefaultWatcherMinInterval default max interval for poll changes // DefaultWatcherMaxInterval default max interval for poll changes
var DefaultWatcherMaxInterval = 9 * time.Second var DefaultWatcherMaxInterval = 9 * time.Second
var ( var (

View File

@ -264,7 +264,7 @@ func (w *microWorkflow) Execute(ctx context.Context, req *Message, opts ...Execu
} }
cherr <- serr cherr <- serr
return return
} else { }
if werr := stepStore.Write(ctx, filepath.Join(step.ID(), "rsp"), rsp); werr != nil { if werr := stepStore.Write(ctx, filepath.Join(step.ID(), "rsp"), rsp); werr != nil {
w.opts.Logger.Errorf(ctx, "store write error: %v", werr) w.opts.Logger.Errorf(ctx, "store write error: %v", werr)
cherr <- werr cherr <- werr
@ -275,7 +275,6 @@ func (w *microWorkflow) Execute(ctx context.Context, req *Message, opts ...Execu
cherr <- werr cherr <- werr
return return
} }
}
}(cstep) }(cstep)
wg.Wait() wg.Wait()
} else { } else {
@ -298,7 +297,7 @@ func (w *microWorkflow) Execute(ctx context.Context, req *Message, opts ...Execu
} }
cherr <- serr cherr <- serr
return return
} else { }
if werr := stepStore.Write(ctx, filepath.Join(cstep.ID(), "rsp"), rsp); werr != nil { if werr := stepStore.Write(ctx, filepath.Join(cstep.ID(), "rsp"), rsp); werr != nil {
w.opts.Logger.Errorf(ctx, "store write error: %v", werr) w.opts.Logger.Errorf(ctx, "store write error: %v", werr)
cherr <- werr cherr <- werr
@ -311,7 +310,6 @@ func (w *microWorkflow) Execute(ctx context.Context, req *Message, opts ...Execu
} }
} }
} }
}
close(done) close(done)
}() }()
@ -337,17 +335,14 @@ func (w *microWorkflow) Execute(ctx context.Context, req *Message, opts ...Execu
if werr := workflowStore.Write(w.opts.Context, "status", &codec.Frame{Data: []byte(StatusAborted.String())}); werr != nil { if werr := workflowStore.Write(w.opts.Context, "status", &codec.Frame{Data: []byte(StatusAborted.String())}); werr != nil {
w.opts.Logger.Errorf(w.opts.Context, "store error: %v", werr) w.opts.Logger.Errorf(w.opts.Context, "store error: %v", werr)
} }
break
case err == nil: case err == nil:
if werr := workflowStore.Write(w.opts.Context, "status", &codec.Frame{Data: []byte(StatusSuccess.String())}); werr != nil { if werr := workflowStore.Write(w.opts.Context, "status", &codec.Frame{Data: []byte(StatusSuccess.String())}); werr != nil {
w.opts.Logger.Errorf(w.opts.Context, "store error: %v", werr) w.opts.Logger.Errorf(w.opts.Context, "store error: %v", werr)
} }
break
case err != nil: case err != nil:
if werr := workflowStore.Write(w.opts.Context, "status", &codec.Frame{Data: []byte(StatusFailure.String())}); werr != nil { if werr := workflowStore.Write(w.opts.Context, "status", &codec.Frame{Data: []byte(StatusFailure.String())}); werr != nil {
w.opts.Logger.Errorf(w.opts.Context, "store error: %v", werr) w.opts.Logger.Errorf(w.opts.Context, "store error: %v", werr)
} }
break
} }
return eid, err return eid, err
@ -499,10 +494,12 @@ func (s *microCallStep) Execute(ctx context.Context, req *Message, opts ...Execu
rsp := &codec.Frame{} rsp := &codec.Frame{}
copts := []client.CallOption{client.WithRetries(0)} copts := []client.CallOption{client.WithRetries(0)}
if options.Timeout > 0 { if options.Timeout > 0 {
copts = append(copts, client.WithRequestTimeout(options.Timeout), client.WithDialTimeout(options.Timeout)) copts = append(copts,
client.WithRequestTimeout(options.Timeout),
client.WithDialTimeout(options.Timeout))
} }
nctx := metadata.NewOutgoingContext(ctx, req.Header) nctx := metadata.NewOutgoingContext(ctx, req.Header)
err := options.Client.Call(nctx, options.Client.NewRequest(s.service, s.method, &codec.Frame{Data: req.Body}), rsp) err := options.Client.Call(nctx, options.Client.NewRequest(s.service, s.method, &codec.Frame{Data: req.Body}), rsp, copts...)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@ -553,7 +550,7 @@ func (s *microPublishStep) String() string {
if s.opts.ID != "" { if s.opts.ID != "" {
return s.opts.ID return s.opts.ID
} }
return fmt.Sprintf("%s", s.topic) return s.topic
} }
func (s *microPublishStep) Name() string { func (s *microPublishStep) Name() string {

6
go.mod
View File

@ -4,11 +4,11 @@ go 1.16
require ( require (
github.com/ef-ds/deque v1.0.4 github.com/ef-ds/deque v1.0.4
github.com/golang-jwt/jwt/v4 v4.0.0 github.com/golang-jwt/jwt/v4 v4.1.0
github.com/imdario/mergo v0.3.12 github.com/imdario/mergo v0.3.12
github.com/patrickmn/go-cache v2.1.0+incompatible github.com/patrickmn/go-cache v2.1.0+incompatible
github.com/silas/dag v0.0.0-20210121180416-41cf55125c34 github.com/silas/dag v0.0.0-20210626123444-3804bac2d6d4
github.com/unistack-org/micro-proto v0.0.9 github.com/unistack-org/micro-proto v0.0.9
golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d golang.org/x/net v0.0.0-20210928044308-7d9f5e0b762b
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 // indirect golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 // indirect
) )

6
go.sum
View File

@ -2,6 +2,8 @@ github.com/ef-ds/deque v1.0.4 h1:iFAZNmveMT9WERAkqLJ+oaABF9AcVQ5AjXem/hroniI=
github.com/ef-ds/deque v1.0.4/go.mod h1:gXDnTC3yqvBcHbq2lcExjtAcVrOnJCbMcZXmuj8Z4tg= github.com/ef-ds/deque v1.0.4/go.mod h1:gXDnTC3yqvBcHbq2lcExjtAcVrOnJCbMcZXmuj8Z4tg=
github.com/golang-jwt/jwt/v4 v4.0.0 h1:RAqyYixv1p7uEnocuy8P1nru5wprCh/MH2BIlW5z5/o= github.com/golang-jwt/jwt/v4 v4.0.0 h1:RAqyYixv1p7uEnocuy8P1nru5wprCh/MH2BIlW5z5/o=
github.com/golang-jwt/jwt/v4 v4.0.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= github.com/golang-jwt/jwt/v4 v4.0.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg=
github.com/golang-jwt/jwt/v4 v4.1.0 h1:XUgk2Ex5veyVFVeLm0xhusUTQybEbexJXrvPNOKkSY0=
github.com/golang-jwt/jwt/v4 v4.1.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg=
github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=
github.com/google/go-cmp v0.5.5 h1:Khx7svrCpmxxtHBq5j2mp/xVjsi8hQMfNLvJFAlrGgU= github.com/google/go-cmp v0.5.5 h1:Khx7svrCpmxxtHBq5j2mp/xVjsi8hQMfNLvJFAlrGgU=
github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
@ -11,10 +13,14 @@ github.com/patrickmn/go-cache v2.1.0+incompatible h1:HRMgzkcYKYpi3C8ajMPV8OFXaaR
github.com/patrickmn/go-cache v2.1.0+incompatible/go.mod h1:3Qf8kWWT7OJRJbdiICTKqZju1ZixQ/KpMGzzAfe6+WQ= github.com/patrickmn/go-cache v2.1.0+incompatible/go.mod h1:3Qf8kWWT7OJRJbdiICTKqZju1ZixQ/KpMGzzAfe6+WQ=
github.com/silas/dag v0.0.0-20210121180416-41cf55125c34 h1:vBfVmA5mZhsQa2jr1FOL9nfA37N/jnbBmi5XUfviVTI= github.com/silas/dag v0.0.0-20210121180416-41cf55125c34 h1:vBfVmA5mZhsQa2jr1FOL9nfA37N/jnbBmi5XUfviVTI=
github.com/silas/dag v0.0.0-20210121180416-41cf55125c34/go.mod h1:7RTUFBdIRC9nZ7/3RyRNH1bdqIShrDejd1YbLwgPS+I= github.com/silas/dag v0.0.0-20210121180416-41cf55125c34/go.mod h1:7RTUFBdIRC9nZ7/3RyRNH1bdqIShrDejd1YbLwgPS+I=
github.com/silas/dag v0.0.0-20210626123444-3804bac2d6d4 h1:fOH64AB0C3ixGf9emky61STvPJL3smxJg+1Zwx1oCdg=
github.com/silas/dag v0.0.0-20210626123444-3804bac2d6d4/go.mod h1:7RTUFBdIRC9nZ7/3RyRNH1bdqIShrDejd1YbLwgPS+I=
github.com/unistack-org/micro-proto v0.0.9 h1:KrWLS4FUX7UAWNAilQf70uad6ZPf/0EudeddCXllRVc= github.com/unistack-org/micro-proto v0.0.9 h1:KrWLS4FUX7UAWNAilQf70uad6ZPf/0EudeddCXllRVc=
github.com/unistack-org/micro-proto v0.0.9/go.mod h1:Cckwmzd89gvS7ThxzZp9kQR/EOdksFQcsTAtDDyKwrg= github.com/unistack-org/micro-proto v0.0.9/go.mod h1:Cckwmzd89gvS7ThxzZp9kQR/EOdksFQcsTAtDDyKwrg=
golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d h1:20cMwl2fHAzkJMEA+8J4JgqBQcQGzbisXo31MIeenXI= golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d h1:20cMwl2fHAzkJMEA+8J4JgqBQcQGzbisXo31MIeenXI=
golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
golang.org/x/net v0.0.0-20210928044308-7d9f5e0b762b h1:eB48h3HiRycXNy8E0Gf5e0hv7YT6Kt14L/D73G1fuwo=
golang.org/x/net v0.0.0-20210928044308-7d9f5e0b762b/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/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-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=

View File

@ -81,7 +81,7 @@ func (l *defaultLogger) Fields(fields ...interface{}) Logger {
} else if len(fields)%2 != 0 { } else if len(fields)%2 != 0 {
fields = fields[:len(fields)-1] fields = fields[:len(fields)-1]
} }
nl.opts.Fields = append(l.opts.Fields, fields...) nl.opts.Fields = append(nl.opts.Fields, fields...)
return nl return nl
} }

View File

@ -125,13 +125,20 @@ func getArgs(args []interface{}) []interface{} {
var err error var err error
for _, arg := range args { for _, arg := range args {
val := reflect.ValueOf(arg) val := reflect.ValueOf(arg)
switch val.Kind() { if val.Kind() == reflect.Ptr {
case reflect.Ptr:
val = val.Elem() val = val.Elem()
} }
narg := arg narg := arg
if val.Kind() == reflect.Struct { if val.Kind() != reflect.Struct {
if narg, err = rutil.Zero(arg); err == nil { nargs = append(nargs, narg)
continue
}
if narg, err = rutil.Zero(arg); err != nil {
nargs = append(nargs, narg)
continue
}
rutil.CopyDefaults(narg, arg) rutil.CopyDefaults(narg, arg)
if flds, ferr := rutil.StructFields(narg); ferr == nil { if flds, ferr := rutil.StructFields(narg); ferr == nil {
for _, fld := range flds { for _, fld := range flds {
@ -140,8 +147,7 @@ func getArgs(args []interface{}) []interface{} {
} }
} }
} }
}
}
nargs = append(nargs, narg) nargs = append(nargs, narg)
} }
return nargs return nargs

View File

@ -3,6 +3,10 @@ package meter
//go:generate sh -c "protoc -I./handler -I../ -I$(go list -f '{{ .Dir }}' -m github.com/unistack-org/micro-proto) --go-micro_out='components=micro|http|server',standalone=false,debug=true,paths=source_relative:./handler handler/handler.proto" //go:generate sh -c "protoc -I./handler -I../ -I$(go list -f '{{ .Dir }}' -m github.com/unistack-org/micro-proto) --go-micro_out='components=micro|http|server',standalone=false,debug=true,paths=source_relative:./handler handler/handler.proto"
import ( import (
// import required packages
_ "github.com/unistack-org/micro-proto/api" _ "github.com/unistack-org/micro-proto/api"
// import required packages
_ "github.com/unistack-org/micro-proto/openapiv2" _ "github.com/unistack-org/micro-proto/openapiv2"
) )

View File

@ -6,6 +6,7 @@ package handler
import ( import (
context "context" context "context"
api "github.com/unistack-org/micro/v3/api" api "github.com/unistack-org/micro/v3/api"
codec "github.com/unistack-org/micro/v3/codec" codec "github.com/unistack-org/micro/v3/codec"
) )

View File

@ -6,6 +6,7 @@ package handler
import ( import (
context "context" context "context"
api "github.com/unistack-org/micro/v3/api" api "github.com/unistack-org/micro/v3/api"
codec "github.com/unistack-org/micro/v3/codec" codec "github.com/unistack-org/micro/v3/codec"
server "github.com/unistack-org/micro/v3/server" server "github.com/unistack-org/micro/v3/server"

View File

@ -33,7 +33,7 @@ func TestBuildLabels(t *testing.T) {
} }
data := []testData{ data := []testData{
testData{ {
src: []string{"zerolabel", "value3", "firstlabel", "value2"}, src: []string{"zerolabel", "value3", "firstlabel", "value2"},
dst: []string{"firstlabel", "value2", "zerolabel", "value3"}, dst: []string{"firstlabel", "value2", "zerolabel", "value3"},
}, },
@ -48,15 +48,15 @@ func TestBuildLabels(t *testing.T) {
func TestBuildName(t *testing.T) { func TestBuildName(t *testing.T) {
data := map[string][]string{ data := map[string][]string{
`my_metric{firstlabel="value2",zerolabel="value3"}`: []string{ `my_metric{firstlabel="value2",zerolabel="value3"}`: {
"my_metric", "my_metric",
"zerolabel", "value3", "firstlabel", "value2", "zerolabel", "value3", "firstlabel", "value2",
}, },
`my_metric{broker="broker2",register="mdns",server="tcp"}`: []string{ `my_metric{broker="broker2",register="mdns",server="tcp"}`: {
"my_metric", "my_metric",
"broker", "broker1", "broker", "broker2", "server", "http", "server", "tcp", "register", "mdns", "broker", "broker1", "broker", "broker2", "server", "http", "server", "tcp", "register", "mdns",
}, },
`my_metric{aaa="aaa"}`: []string{ `my_metric{aaa="aaa"}`: {
"my_metric", "my_metric",
"aaa", "aaa", "aaa", "aaa",
}, },

View File

@ -82,7 +82,7 @@ func (t *tunBroker) BatchPublish(ctx context.Context, msgs []*broker.Message, op
topic, _ := msg.Header.Get(metadata.HeaderTopic) topic, _ := msg.Header.Get(metadata.HeaderTopic)
c, ok := topicMap[topic] c, ok := topicMap[topic]
if !ok { if !ok {
c, err := t.tunnel.Dial(ctx, topic, tunnel.DialMode(tunnel.Multicast)) c, err = t.tunnel.Dial(ctx, topic, tunnel.DialMode(tunnel.Multicast))
if err != nil { if err != nil {
return err return err
} }

View File

@ -31,7 +31,7 @@ func (p *profiler) writeHeap(f *os.File) {
select { select {
case <-t.C: case <-t.C:
runtime.GC() runtime.GC()
pprof.WriteHeapProfile(f) _ = pprof.WriteHeapProfile(f)
case <-p.exit: case <-p.exit:
return return
} }

View File

@ -40,8 +40,9 @@ func (d *dns) Lookup(opts ...QueryOption) ([]Route, error) {
// check to see if we have the port provided in the service, e.g. go-micro-srv-foo:8000 // check to see if we have the port provided in the service, e.g. go-micro-srv-foo:8000
host, port, err := net.SplitHostPort(options.Service) host, port, err := net.SplitHostPort(options.Service)
if err == nil { if err == nil {
var ips []string
// lookup the service using A records // lookup the service using A records
ips, err := net.LookupHost(host) ips, err = net.LookupHost(host)
if err != nil { if err != nil {
return nil, err return nil, err
} }

View File

@ -3,6 +3,10 @@ package server
//go:generate sh -c "protoc -I./health -I../ -I$(go list -f '{{ .Dir }}' -m github.com/unistack-org/micro-proto) --go-micro_out='components=micro|http|server',standalone=false,debug=true,paths=source_relative:./health health/health.proto" //go:generate sh -c "protoc -I./health -I../ -I$(go list -f '{{ .Dir }}' -m github.com/unistack-org/micro-proto) --go-micro_out='components=micro|http|server',standalone=false,debug=true,paths=source_relative:./health health/health.proto"
import ( import (
// import required packages
_ "github.com/unistack-org/micro-proto/api" _ "github.com/unistack-org/micro-proto/api"
// import required packages
_ "github.com/unistack-org/micro-proto/openapiv2" _ "github.com/unistack-org/micro-proto/openapiv2"
) )

View File

@ -6,6 +6,7 @@ package health
import ( import (
context "context" context "context"
api "github.com/unistack-org/micro/v3/api" api "github.com/unistack-org/micro/v3/api"
codec "github.com/unistack-org/micro/v3/codec" codec "github.com/unistack-org/micro/v3/codec"
) )

View File

@ -6,6 +6,7 @@ package health
import ( import (
context "context" context "context"
api "github.com/unistack-org/micro/v3/api" api "github.com/unistack-org/micro/v3/api"
codec "github.com/unistack-org/micro/v3/codec" codec "github.com/unistack-org/micro/v3/codec"
server "github.com/unistack-org/micro/v3/server" server "github.com/unistack-org/micro/v3/server"

View File

@ -190,7 +190,7 @@ func (n *noopServer) Register() error {
} }
// register the service // register the service
if err := DefaultRegisterFunc(service, config); err != nil { if err = DefaultRegisterFunc(service, config); err != nil {
return err return err
} }

View File

@ -20,10 +20,6 @@ type TestMessage struct {
Name string Name string
} }
var (
numMsg int = 8
)
func (h *TestHandler) SingleSubHandler(ctx context.Context, msg *codec.Frame) error { func (h *TestHandler) SingleSubHandler(ctx context.Context, msg *codec.Frame) error {
// fmt.Printf("msg %s\n", msg.Data) // fmt.Printf("msg %s\n", msg.Data)
return nil return nil

View File

@ -11,6 +11,7 @@ import (
"unicode/utf8" "unicode/utf8"
"github.com/unistack-org/micro/v3/broker" "github.com/unistack-org/micro/v3/broker"
"github.com/unistack-org/micro/v3/codec"
"github.com/unistack-org/micro/v3/errors" "github.com/unistack-org/micro/v3/errors"
"github.com/unistack-org/micro/v3/logger" "github.com/unistack-org/micro/v3/logger"
"github.com/unistack-org/micro/v3/metadata" "github.com/unistack-org/micro/v3/metadata"
@ -72,7 +73,7 @@ func ValidateSubscriber(sub Subscriber) error {
if argType.Kind() != reflect.Slice { if argType.Kind() != reflect.Slice {
return fmt.Errorf("subscriber %v dont have required signature %s", name, batchSubSig) return fmt.Errorf("subscriber %v dont have required signature %s", name, batchSubSig)
} }
if strings.Compare(fmt.Sprintf("%s", argType), "[]interface{}") == 0 { if strings.Compare(fmt.Sprintf("%v", argType), "[]interface{}") == 0 {
return fmt.Errorf("subscriber %v dont have required signaure %s", name, batchSubSig) return fmt.Errorf("subscriber %v dont have required signaure %s", name, batchSubSig)
} }
} }
@ -244,9 +245,9 @@ func (n *noopServer) newBatchSubHandler(sb *subscriber, opts Options) broker.Bat
} }
reqType := handler.reqType reqType := handler.reqType
var cf codec.Codec
for _, msg := range msgs { for _, msg := range msgs {
cf, err := n.newCodec(msg.ContentType()) cf, err = n.newCodec(msg.ContentType())
if err != nil { if err != nil {
return err return err
} }

View File

@ -6,20 +6,18 @@ import (
// LogfFunc function used for Logf method // LogfFunc function used for Logf method
// type LogfFunc func(ctx context.Context, level Level, msg string, args ...interface{}) // type LogfFunc func(ctx context.Context, level Level, msg string, args ...interface{})
// type Wrapper interface { // type Wrapper interface {
// Logf logs message with needed level // Logf logs message with needed level
// Logf(LogfFunc) LogfFunc // Logf(LogfFunc) LogfFunc
// } // }
// NamespaceStore wrap store with namespace
type NamespaceStore struct { type NamespaceStore struct {
s Store s Store
ns string ns string
} }
var ( var _ Store = &NamespaceStore{}
_ Store = &NamespaceStore{}
)
func NewNamespaceStore(s Store, ns string) Store { func NewNamespaceStore(s Store, ns string) Store {
return &NamespaceStore{s: s, ns: ns} return &NamespaceStore{s: s, ns: ns}

View File

@ -3,6 +3,7 @@
package http package http
import ( import (
"io"
"net" "net"
"net/http" "net/http"
"testing" "testing"
@ -80,5 +81,4 @@ func TestRoundTripper(t *testing.T) {
if string(b) != "hello world" { if string(b) != "hello world" {
t.Fatal("response is", string(b)) t.Fatal("response is", string(b))
} }
} }

View File

@ -8,9 +8,9 @@ import (
// Tree is a trie tree. // Tree is a trie tree.
type Trie struct { type Trie struct {
rmu sync.RWMutex
node *node node *node
rcache map[string]*regexp.Regexp rcache map[string]*regexp.Regexp
rmu sync.RWMutex
} }
// node is a node of tree // node is a node of tree

View File

@ -5,6 +5,26 @@ import (
"testing" "testing"
) )
func TestTrieContentType(t *testing.T) {
type handler struct {
name string
}
tr := NewTrie()
tr.Insert([]string{"application/json"}, "/v1/create/{id}", &handler{name: "test"})
h, _, ok := tr.Search("application/json", "/v1/create/12")
if !ok {
t.Fatalf("must be found error")
}
if h.(*handler).name != "test" {
t.Fatalf("invalid handler %v", h)
}
_, _, ok = tr.Search("text/xml", "/v1/create/12")
if ok {
t.Fatalf("must be not found error")
}
}
func TestTrieNoMatchMethod(t *testing.T) { func TestTrieNoMatchMethod(t *testing.T) {
tr := NewTrie() tr := NewTrie()
tr.Insert([]string{http.MethodPut}, "/v1/create/{id}", nil) tr.Insert([]string{http.MethodPut}, "/v1/create/{id}", nil)

View File

@ -12,9 +12,8 @@ import (
// ErrInvalidParam specifies invalid url query params // ErrInvalidParam specifies invalid url query params
var ErrInvalidParam = errors.New("invalid url query param provided") var ErrInvalidParam = errors.New("invalid url query param provided")
var bracketSplitter = regexp.MustCompile(`\[|\]`)
// var timeKind = reflect.ValueOf(time.Time{}).Kind() // var timeKind = reflect.ValueOf(time.Time{}).Kind()
var bracketSplitter = regexp.MustCompile(`\[|\]`)
type StructField struct { type StructField struct {
Field reflect.StructField Field reflect.StructField

View File

@ -2,7 +2,7 @@ package reflect
import ( import (
"net/url" "net/url"
"reflect" rfl "reflect"
rfl "reflect" rfl "reflect"
"testing" "testing"
) )

View File

@ -13,7 +13,7 @@ import (
// authClaims to be encoded in the JWT // authClaims to be encoded in the JWT
type authClaims struct { type authClaims struct {
Metadata metadata.Metadata `json:"metadata"` Metadata metadata.Metadata `json:"metadata"`
jwt.StandardClaims jwt.RegisteredClaims
Type string `json:"type"` Type string `json:"type"`
Scopes []string `json:"scopes"` Scopes []string `json:"scopes"`
} }
@ -50,10 +50,10 @@ func (j *JWT) Generate(acc *auth.Account, opts ...token.GenerateOption) (*token.
// generate the JWT // generate the JWT
expiry := time.Now().Add(options.Expiry) expiry := time.Now().Add(options.Expiry)
t := jwt.NewWithClaims(jwt.SigningMethodRS256, authClaims{ t := jwt.NewWithClaims(jwt.SigningMethodRS256, authClaims{
Type: acc.Type, Scopes: acc.Scopes, Metadata: acc.Metadata, StandardClaims: jwt.StandardClaims{ Type: acc.Type, Scopes: acc.Scopes, Metadata: acc.Metadata, RegisteredClaims: jwt.RegisteredClaims{
Subject: acc.ID, Subject: acc.ID,
Issuer: acc.Issuer, Issuer: acc.Issuer,
ExpiresAt: expiry.Unix(), ExpiresAt: jwt.NewNumericDate(expiry),
}, },
}) })
tok, err := t.SignedString(key) tok, err := t.SignedString(key)