diff --git a/internal/common/common.go b/internal/common/common.go index a7adc74..c49cbc0 100644 --- a/internal/common/common.go +++ b/internal/common/common.go @@ -5,3 +5,4 @@ type contextKey string const RouterContextKey contextKey = contextKey("router") const SourceContextKey contextKey = contextKey("source") const ModulesContextKey contextKey = contextKey("modules") +const SenderContextKey contextKey = contextKey("sender") diff --git a/internal/module/http-server.go b/internal/module/http-server.go index 5b9c13a..0df3b29 100644 --- a/internal/module/http-server.go +++ b/internal/module/http-server.go @@ -6,6 +6,7 @@ import ( "errors" "fmt" "log/slog" + "net" "net/http" "github.com/jwetzell/showbridge-go/internal/common" @@ -84,6 +85,10 @@ func (hs *HTTPServer) ServeHTTP(w http.ResponseWriter, r *http.Request) { } if hs.router != nil { inputContext := context.WithValue(hs.ctx, httpServerContextKey("responseWriter"), &responseWriter) + senderAddr, err := net.ResolveTCPAddr("tcp", r.RemoteAddr) + if err == nil { + inputContext = context.WithValue(inputContext, common.SenderContextKey, senderAddr) + } aRouteFound, routingErrors := hs.router.HandleInput(inputContext, hs.Id(), r) if !responseWriter.done { if aRouteFound { diff --git a/internal/module/tcp-server.go b/internal/module/tcp-server.go index 757c0b2..1fc2136 100644 --- a/internal/module/tcp-server.go +++ b/internal/module/tcp-server.go @@ -142,7 +142,13 @@ ClientRead: messages := ts.Framer.Decode(buffer[0:byteCount]) for _, message := range messages { if ts.router != nil { - ts.router.HandleInput(ts.ctx, ts.Id(), message) + senderAddr, ok := client.RemoteAddr().(*net.TCPAddr) + if ok { + senderCtx := context.WithValue(ts.ctx, common.SenderContextKey, senderAddr) + ts.router.HandleInput(senderCtx, ts.Id(), message) + } else { + ts.router.HandleInput(ts.ctx, ts.Id(), message) + } } else { ts.logger.Error("input received but no router is configured") } diff --git a/internal/module/udp-server.go b/internal/module/udp-server.go index 3aae487..6ff7bac 100644 --- a/internal/module/udp-server.go +++ b/internal/module/udp-server.go @@ -97,7 +97,7 @@ func (us *UDPServer) Start(ctx context.Context) error { default: listener.SetDeadline(time.Now().Add(time.Millisecond * 200)) - numBytes, _, err := listener.ReadFromUDP(buffer) + numBytes, senderAddr, err := listener.ReadFromUDP(buffer) if err != nil { //NOTE(jwetzell) we hit deadline if opErr, ok := err.(*net.OpError); ok && opErr.Timeout() { @@ -107,7 +107,8 @@ func (us *UDPServer) Start(ctx context.Context) error { } message := buffer[:numBytes] if us.router != nil { - us.router.HandleInput(us.ctx, us.Id(), message) + senderCtx := context.WithValue(us.ctx, common.SenderContextKey, senderAddr) + us.router.HandleInput(senderCtx, us.Id(), message) } else { us.logger.Error("input received but no router is configured") } diff --git a/internal/processor/processor.go b/internal/processor/processor.go index a9a72fa..be016a7 100644 --- a/internal/processor/processor.go +++ b/internal/processor/processor.go @@ -50,6 +50,7 @@ func GetAnyAs[T any](p any) (T, bool) { type TemplateData struct { Payload any Modules any + Sender any } func GetTemplateData(ctx context.Context, payload any) TemplateData { @@ -58,5 +59,10 @@ func GetTemplateData(ctx context.Context, payload any) TemplateData { if modules != nil { templateData.Modules = modules } + + sender := ctx.Value(common.SenderContextKey) + if sender != nil { + templateData.Sender = sender + } return templateData }