diff --git a/internal/common/module.go b/internal/common/module.go index 0d9477b..f81bffa 100644 --- a/internal/common/module.go +++ b/internal/common/module.go @@ -10,6 +10,9 @@ type Module interface { Type() string Start(context.Context) error Stop() +} + +type OutputModule interface { Output(context.Context, any) error } diff --git a/internal/module/midi-input.go b/internal/module/midi-input.go index d0d9a8f..5591e20 100644 --- a/internal/module/midi-input.go +++ b/internal/module/midi-input.go @@ -82,10 +82,6 @@ func (mi *MIDIInput) Start(ctx context.Context) error { return nil } -func (mi *MIDIInput) Output(ctx context.Context, payload any) error { - return errors.New("midi.input output is not implemented") -} - func (mi *MIDIInput) Stop() { mi.cancel() } diff --git a/internal/module/nats-server.go b/internal/module/nats-server.go index 5fb0896..76e0573 100644 --- a/internal/module/nats-server.go +++ b/internal/module/nats-server.go @@ -102,10 +102,6 @@ func (ns *NATSServer) Start(ctx context.Context) error { return nil } -func (ns *NATSServer) Output(ctx context.Context, payload any) error { - return errors.New("nats.server does not support output") -} - func (ns *NATSServer) Stop() { ns.cancel() if ns.server != nil { diff --git a/internal/module/psn-client.go b/internal/module/psn-client.go index 4e374de..918b64c 100644 --- a/internal/module/psn-client.go +++ b/internal/module/psn-client.go @@ -3,7 +3,6 @@ package module import ( "context" "errors" - "fmt" "log/slog" "net" "time" @@ -105,10 +104,6 @@ func (pc *PSNClient) Start(ctx context.Context) error { } } -func (pc *PSNClient) Output(ctx context.Context, payload any) error { - return fmt.Errorf("psn.client output is not implemented") -} - func (pc *PSNClient) Stop() { pc.cancel() } diff --git a/internal/module/test/module_test.go b/internal/module/test/module_test.go index 98e5f43..5ea4664 100644 --- a/internal/module/test/module_test.go +++ b/internal/module/test/module_test.go @@ -12,10 +12,6 @@ import ( type TestModule struct { } -func (m *TestModule) Output(ctx context.Context, payload any) error { - return nil -} - func (m *TestModule) Start(ctx context.Context) error { <-ctx.Done() return nil diff --git a/internal/module/time-interval.go b/internal/module/time-interval.go index c26f517..e79efc5 100644 --- a/internal/module/time-interval.go +++ b/internal/module/time-interval.go @@ -74,11 +74,6 @@ func (i *TimeInterval) Start(ctx context.Context) error { } -func (i *TimeInterval) Output(ctx context.Context, payload any) error { - i.ticker.Reset(time.Millisecond * time.Duration(i.Duration)) - return nil -} - func (i *TimeInterval) Stop() { i.cancel() } diff --git a/internal/module/time-timer.go b/internal/module/time-timer.go index d624e60..7161e1d 100644 --- a/internal/module/time-timer.go +++ b/internal/module/time-timer.go @@ -73,11 +73,6 @@ func (t *TimeTimer) Start(ctx context.Context) error { } } -func (t *TimeTimer) Output(ctx context.Context, payload any) error { - t.timer.Reset(time.Millisecond * time.Duration(t.Duration)) - return nil -} - func (t *TimeTimer) Stop() { t.cancel() } diff --git a/router.go b/router.go index d0a3bc1..79b72a8 100644 --- a/router.go +++ b/router.go @@ -269,9 +269,20 @@ func (r *Router) HandleOutput(ctx context.Context, destinationId string, payload return err } + outputModule, ok := destinationModule.(common.OutputModule) + if !ok { + err := errors.New("module does not support output") + span.SetStatus(codes.Error, err.Error()) + span.RecordError(err) + r.logger.Error("module does not support output", "destinationId", destinationId) + outputEvent.Error = err.Error() + r.broadcastEvent(outputEvent) + return err + } + moduleOutputCtx, moduleOutputSpan := otel.Tracer("module").Start(spanCtx, "output", trace.WithAttributes(attribute.String("module.id", destinationModule.Id()), attribute.String("module.type", destinationModule.Type()))) defer moduleOutputSpan.End() - err := destinationModule.Output(moduleOutputCtx, payload) + err := outputModule.Output(moduleOutputCtx, payload) if err != nil { moduleOutputSpan.SetStatus(codes.Error, err.Error()) moduleOutputSpan.RecordError(err)