From c6bf54943a46b9519f87d9700407a03a2e0a3f60 Mon Sep 17 00:00:00 2001 From: admin Date: Thu, 10 Jul 2025 10:23:03 +0200 Subject: [PATCH] better handler registration and dispatch --- v2/context.go | 17 ++++---- v2/event.go | 5 +++ v2/handler.go | 1 + v2/implementation_test/data/dto/greeting.go | 5 +++ .../events/definitions/greet_event.go | 26 +++++++++++++ .../events/definitions/greet_me_event.go | 23 +++++++++++ .../events/definitions/ping_event.go | 19 +++++++++ .../events/definitions/pong_event.go | 19 +++++++++ v2/implementation_test/events/greeter.go | 39 ------------------- .../events/handler/greet_me_handler.go | 34 ++++++++++++++++ v2/implementation_test/events/handler/ping.go | 24 ++++++++++++ v2/implementation_test/events/ping.go | 19 --------- .../filter/same_username.go | 12 ++++++ v2/implementation_test/main.go | 11 +++--- v2/registration.go | 17 ++++---- 15 files changed, 190 insertions(+), 81 deletions(-) create mode 100644 v2/implementation_test/data/dto/greeting.go create mode 100644 v2/implementation_test/events/definitions/greet_event.go create mode 100644 v2/implementation_test/events/definitions/greet_me_event.go create mode 100644 v2/implementation_test/events/definitions/ping_event.go create mode 100644 v2/implementation_test/events/definitions/pong_event.go delete mode 100644 v2/implementation_test/events/greeter.go create mode 100644 v2/implementation_test/events/handler/greet_me_handler.go create mode 100644 v2/implementation_test/events/handler/ping.go delete mode 100644 v2/implementation_test/events/ping.go create mode 100644 v2/implementation_test/filter/same_username.go diff --git a/v2/context.go b/v2/context.go index 9987ad7..709f131 100644 --- a/v2/context.go +++ b/v2/context.go @@ -2,10 +2,11 @@ package serverevents import ( gocontext "context" - di "git.apihub24.de/admin/generic-di" - "github.com/coder/websocket" "sync" "time" + + di "git.apihub24.de/admin/generic-di" + "github.com/coder/websocket" ) func init() { @@ -21,7 +22,7 @@ type IContext interface { Get(key string) (any, bool) RemoveMetaData(key string) CleanupIn(lifetime time.Duration) - Dispatch(eventName string, data any, filter func(c IContext) bool) + Dispatch(event IEvent, filter func(c IContext) bool) IsCaller(c IContext) bool } @@ -84,9 +85,7 @@ func (context *context) RemoveMetaData(key string) { context.mutex.Lock() defer context.mutex.Unlock() - if _, ok := context.metadata[key]; ok { - delete(context.metadata, key) - } + delete(context.metadata, key) } func (context *context) CleanupIn(lifetime time.Duration) { @@ -110,10 +109,10 @@ func (context *context) CleanupIn(lifetime time.Duration) { }(context.id) } -func (context *context) Dispatch(eventName string, data any, filter func(c IContext) bool) { +func (context *context) Dispatch(event IEvent, filter func(c IContext) bool) { ev := Event{ - Type: eventName, - Data: data, + Type: event.GetEventName(), + Data: event.GetEventData(), IsBackendOnly: filter == nil, Filter: filter, } diff --git a/v2/event.go b/v2/event.go index da3e66e..c530b28 100644 --- a/v2/event.go +++ b/v2/event.go @@ -6,3 +6,8 @@ type Event struct { IsBackendOnly bool `json:"-"` Filter func(c IContext) bool `json:"-"` } + +type IEvent interface { + GetEventName() string + GetEventData() any +} diff --git a/v2/handler.go b/v2/handler.go index 102a201..42d6180 100644 --- a/v2/handler.go +++ b/v2/handler.go @@ -1,6 +1,7 @@ package serverevents type IEventHandler interface { + GetConnectedEventName() string CanExecute(IContext) bool Handle(IContext, any) } diff --git a/v2/implementation_test/data/dto/greeting.go b/v2/implementation_test/data/dto/greeting.go new file mode 100644 index 0000000..70729f0 --- /dev/null +++ b/v2/implementation_test/data/dto/greeting.go @@ -0,0 +1,5 @@ +package dto + +type Greeting struct { + Message string `json:"message"` +} diff --git a/v2/implementation_test/events/definitions/greet_event.go b/v2/implementation_test/events/definitions/greet_event.go new file mode 100644 index 0000000..90ffe7b --- /dev/null +++ b/v2/implementation_test/events/definitions/greet_event.go @@ -0,0 +1,26 @@ +package definitions + +import ( + serverevents "git.apihub24.de/admin/server_events/v2" + "git.apihub24.de/admin/server_events/v2/implementation_test/data/dto" +) + +const GreeterEventName = "greet" + +type greetEvent struct { + data dto.Greeting +} + +func NewGreetEvent(data dto.Greeting) serverevents.IEvent { + return &greetEvent{ + data: data, + } +} + +func (ev *greetEvent) GetEventName() string { + return GreeterEventName +} + +func (ev *greetEvent) GetEventData() any { + return ev.data +} diff --git a/v2/implementation_test/events/definitions/greet_me_event.go b/v2/implementation_test/events/definitions/greet_me_event.go new file mode 100644 index 0000000..77ec583 --- /dev/null +++ b/v2/implementation_test/events/definitions/greet_me_event.go @@ -0,0 +1,23 @@ +package definitions + +import serverevents "git.apihub24.de/admin/server_events/v2" + +const GreetMeEventName = "greet me" + +type greetMeEvent struct { + data string +} + +func NewGreetMeEvent(name string) serverevents.IEvent { + return &greetMeEvent{ + data: name, + } +} + +func (ev *greetMeEvent) GetEventName() string { + return GreetMeEventName +} + +func (ev *greetMeEvent) GetEventData() any { + return ev.data +} diff --git a/v2/implementation_test/events/definitions/ping_event.go b/v2/implementation_test/events/definitions/ping_event.go new file mode 100644 index 0000000..894e2a5 --- /dev/null +++ b/v2/implementation_test/events/definitions/ping_event.go @@ -0,0 +1,19 @@ +package definitions + +import serverevents "git.apihub24.de/admin/server_events/v2" + +const PingEventName = "ping" + +type pingEvent struct{} + +func NewPingEvent() serverevents.IEvent { + return &pingEvent{} +} + +func (ev *pingEvent) GetEventName() string { + return PingEventName +} + +func (ev *pingEvent) GetEventData() any { + return nil +} diff --git a/v2/implementation_test/events/definitions/pong_event.go b/v2/implementation_test/events/definitions/pong_event.go new file mode 100644 index 0000000..4f1b105 --- /dev/null +++ b/v2/implementation_test/events/definitions/pong_event.go @@ -0,0 +1,19 @@ +package definitions + +import serverevents "git.apihub24.de/admin/server_events/v2" + +const PongEventName = "pong" + +type pongEvent struct{} + +func NewPongEvent() serverevents.IEvent { + return &pongEvent{} +} + +func (ev *pongEvent) GetEventName() string { + return PongEventName +} + +func (ev *pongEvent) GetEventData() any { + return nil +} diff --git a/v2/implementation_test/events/greeter.go b/v2/implementation_test/events/greeter.go deleted file mode 100644 index 9a4cf8e..0000000 --- a/v2/implementation_test/events/greeter.go +++ /dev/null @@ -1,39 +0,0 @@ -package events - -import ( - "fmt" - serverevents "git.apihub24.de/admin/server_events/v2" -) - -func withSameUserName(context serverevents.IContext) func(context serverevents.IContext) bool { - return serverevents.CreateMetaDataFilter(context, func(c serverevents.IContext) string { - userName, _ := serverevents.MetadataAs[string](context, "UserName") - return userName - }, func(a string, b string) bool { - return a == b - }) -} - -type greeting struct { - Message string -} - -type greeterEventHandler struct{} - -func (handler greeterEventHandler) CanExecute(_ serverevents.IContext) bool { - return true -} - -func (handler greeterEventHandler) Handle(context serverevents.IContext, data any) { - userName, ok := serverevents.ValueAs[string](data) - if !ok || len(userName) < 1 { - userName = "Anonymous" - } - context.Dispatch("greet", greeting{ - Message: fmt.Sprintf("Hello, %s", userName), - }, withSameUserName(context)) -} - -func NewGreeterEventHandler() serverevents.IEventHandler { - return &greeterEventHandler{} -} diff --git a/v2/implementation_test/events/handler/greet_me_handler.go b/v2/implementation_test/events/handler/greet_me_handler.go new file mode 100644 index 0000000..28a9666 --- /dev/null +++ b/v2/implementation_test/events/handler/greet_me_handler.go @@ -0,0 +1,34 @@ +package handler + +import ( + "fmt" + + serverevents "git.apihub24.de/admin/server_events/v2" + "git.apihub24.de/admin/server_events/v2/implementation_test/data/dto" + "git.apihub24.de/admin/server_events/v2/implementation_test/events/definitions" + "git.apihub24.de/admin/server_events/v2/implementation_test/filter" +) + +type greetMeEventHandler struct{} + +func NewGreetMeEventHandler() serverevents.IEventHandler { + return &greetMeEventHandler{} +} + +func (handler *greetMeEventHandler) GetConnectedEventName() string { + return definitions.GreetMeEventName +} + +func (handler *greetMeEventHandler) CanExecute(_ serverevents.IContext) bool { + return true +} + +func (handler *greetMeEventHandler) Handle(context serverevents.IContext, data any) { + userName, ok := serverevents.ValueAs[string](data) + if !ok || len(userName) < 1 { + userName = "Anonymous" + } + context.Dispatch(definitions.NewGreetEvent(dto.Greeting{ + Message: fmt.Sprintf("Hello, %s", userName), + }), filter.WithSameUserName(context)) +} diff --git a/v2/implementation_test/events/handler/ping.go b/v2/implementation_test/events/handler/ping.go new file mode 100644 index 0000000..24640a4 --- /dev/null +++ b/v2/implementation_test/events/handler/ping.go @@ -0,0 +1,24 @@ +package handler + +import ( + serverevents "git.apihub24.de/admin/server_events/v2" + "git.apihub24.de/admin/server_events/v2/implementation_test/events/definitions" +) + +type pingEventHandler struct{} + +func NewPingEventHandler() serverevents.IEventHandler { + return &pingEventHandler{} +} + +func (handler *pingEventHandler) GetConnectedEventName() string { + return definitions.PingEventName +} + +func (handler *pingEventHandler) CanExecute(_ serverevents.IContext) bool { + return true +} + +func (handler *pingEventHandler) Handle(context serverevents.IContext, _ any) { + context.Dispatch(definitions.NewPongEvent(), context.IsCaller) +} diff --git a/v2/implementation_test/events/ping.go b/v2/implementation_test/events/ping.go deleted file mode 100644 index db519e2..0000000 --- a/v2/implementation_test/events/ping.go +++ /dev/null @@ -1,19 +0,0 @@ -package events - -import ( - serverevents "git.apihub24.de/admin/server_events/v2" -) - -type pingEventHandler struct{} - -func NewPingEventHandler() serverevents.IEventHandler { - return &pingEventHandler{} -} - -func (p pingEventHandler) CanExecute(_ serverevents.IContext) bool { - return true -} - -func (p pingEventHandler) Handle(context serverevents.IContext, _ any) { - context.Dispatch("pong", nil, context.IsCaller) -} diff --git a/v2/implementation_test/filter/same_username.go b/v2/implementation_test/filter/same_username.go new file mode 100644 index 0000000..259969b --- /dev/null +++ b/v2/implementation_test/filter/same_username.go @@ -0,0 +1,12 @@ +package filter + +import serverevents "git.apihub24.de/admin/server_events/v2" + +func WithSameUserName(context serverevents.IContext) func(context serverevents.IContext) bool { + return serverevents.CreateMetaDataFilter(context, func(c serverevents.IContext) string { + userName, _ := serverevents.MetadataAs[string](context, "UserName") + return userName + }, func(a string, b string) bool { + return a == b + }) +} diff --git a/v2/implementation_test/main.go b/v2/implementation_test/main.go index c1417a5..d8e4f1f 100644 --- a/v2/implementation_test/main.go +++ b/v2/implementation_test/main.go @@ -1,20 +1,21 @@ package main import ( - di "git.apihub24.de/admin/generic-di" - serverevents "git.apihub24.de/admin/server_events/v2" - "git.apihub24.de/admin/server_events/v2/implementation_test/events" "log" "net/http" "time" + + di "git.apihub24.de/admin/generic-di" + serverevents "git.apihub24.de/admin/server_events/v2" + "git.apihub24.de/admin/server_events/v2/implementation_test/events/handler" ) func main() { serverEventsMiddleware := di.Inject[serverevents.IMiddleware]() eventRegistration := di.Inject[serverevents.IEventHandlerRegistration]() - eventRegistration.Add("ping", events.NewPingEventHandler) - eventRegistration.Add("greet me", events.NewGreeterEventHandler) + eventRegistration.Use(handler.NewPingEventHandler) + eventRegistration.Use(handler.NewGreetMeEventHandler) router := http.NewServeMux() diff --git a/v2/registration.go b/v2/registration.go index 0f9149e..3dc72a1 100644 --- a/v2/registration.go +++ b/v2/registration.go @@ -2,8 +2,9 @@ package serverevents import ( "fmt" - di "git.apihub24.de/admin/generic-di" "sync" + + di "git.apihub24.de/admin/generic-di" ) func init() { @@ -11,7 +12,7 @@ func init() { } type IEventHandlerRegistration interface { - Add(eventType string, creator func() IEventHandler) + Use(creator func() IEventHandler) GetHandler(eventType string) (IEventHandler, error) } @@ -29,16 +30,14 @@ func newEventHandlerRegistration() IEventHandlerRegistration { } } -func (registration *eventHandlerRegistration) Add(eventType string, creator func() IEventHandler) { +func (registration *eventHandlerRegistration) Use(creator func() IEventHandler) { registration.mutex.Lock() defer registration.mutex.Unlock() - if _, ok := registration.instances[eventType]; ok { - delete(registration.instances, eventType) - } - if _, ok := registration.creators[eventType]; ok { - delete(registration.creators, eventType) - } + tmp := creator() + eventType := tmp.GetConnectedEventName() + delete(registration.instances, eventType) + delete(registration.creators, eventType) registration.creators[eventType] = creator }