From 99cfa72fa1b1a99c27dbccda4d5ad2d6f4729125 Mon Sep 17 00:00:00 2001 From: Snider Date: Fri, 17 Apr 2026 21:01:05 +0100 Subject: [PATCH] Harden nil event handling --- pkg/events/service.go | 3 +++ pkg/events/service_test.go | 22 ++++++++++++++++++++++ 2 files changed, 25 insertions(+) diff --git a/pkg/events/service.go b/pkg/events/service.go index 1018f186..742ba210 100644 --- a/pkg/events/service.go +++ b/pkg/events/service.go @@ -49,6 +49,9 @@ func (s *Service) OnStartup(_ context.Context) core.Result { return core.Result{Value: err, OK: false} } cancel := s.platform.On(t.Name, func(event *CustomEvent) { + if event == nil { + return + } _ = s.Core().ACTION(ActionEventFired{Event: *event}) }) s.mu.Lock() diff --git a/pkg/events/service_test.go b/pkg/events/service_test.go index 234c0a53..9734f3ff 100644 --- a/pkg/events/service_test.go +++ b/pkg/events/service_test.go @@ -184,6 +184,28 @@ func TestTaskOn_Good(t *testing.T) { assert.Equal(t, "dark", received[0].Event.Data) } +func TestTaskOn_NilEvent_Ignores(t *testing.T) { + _, c, mock := newTestService(t) + + var received []ActionEventFired + c.RegisterAction(func(_ *core.Core, msg core.Message) core.Result { + if fired, ok := msg.(ActionEventFired); ok { + received = append(received, fired) + } + return core.Result{OK: true} + }) + + r := taskRun(c, "events.on", TaskOn{Name: "theme:changed"}) + require.True(t, r.OK) + + require.NotEmpty(t, mock.listeners["theme:changed"]) + require.NotPanics(t, func() { + mock.listeners["theme:changed"][0].callback(nil) + }) + + assert.Empty(t, received) +} + func TestTaskOff_Good(t *testing.T) { _, c, mock := newTestService(t)