Skip to content

Commit 1b0e25d

Browse files
committed
Move extracting middleware config over to shared internal code
1 parent 33f0249 commit 1b0e25d

4 files changed

Lines changed: 95 additions & 95 deletions

File tree

client.go

Lines changed: 2 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ import (
2323
"github.com/riverqueue/river/internal/maintenance"
2424
"github.com/riverqueue/river/internal/notifier"
2525
"github.com/riverqueue/river/internal/notifylimiter"
26+
"github.com/riverqueue/river/internal/pluginconfig"
2627
"github.com/riverqueue/river/internal/pluginlookup"
2728
"github.com/riverqueue/river/internal/rivercommon"
2829
"github.com/riverqueue/river/internal/riverplugin"
@@ -544,35 +545,6 @@ func (c *Config) WithDefaults() *Config {
544545
}
545546
}
546547

547-
func middlewareFromConfig(config *Config) []rivertype.Middleware {
548-
middleware := make([]rivertype.Middleware, 0,
549-
len(config.Middleware)+len(config.JobInsertMiddleware)+len(config.WorkerMiddleware))
550-
middleware = append(middleware, config.Middleware...)
551-
552-
for _, jobInsertMiddleware := range config.JobInsertMiddleware {
553-
middleware = append(middleware, jobInsertMiddleware)
554-
}
555-
556-
outerLoop:
557-
for _, workerMiddleware := range config.WorkerMiddleware {
558-
// Don't add the middleware if it also implements JobInsertMiddleware
559-
// and the instance has been added to config.JobInsertMiddleware. This
560-
// is a hedge to make sure we don't accidentally double add middleware
561-
// as we've converted over to the unified config.Middleware setting.
562-
if workerMiddlewareAsJobInsertMiddleware, ok := workerMiddleware.(rivertype.JobInsertMiddleware); ok {
563-
for _, jobInsertMiddleware := range config.JobInsertMiddleware {
564-
if workerMiddlewareAsJobInsertMiddleware == jobInsertMiddleware {
565-
continue outerLoop
566-
}
567-
}
568-
}
569-
570-
middleware = append(middleware, workerMiddleware)
571-
}
572-
573-
return middleware
574-
}
575-
576548
func (c *Config) validate() error {
577549
if c.CancelledJobRetentionPeriod < -1 {
578550
return errors.New("CancelledJobRetentionPeriod time cannot be less than zero, except for -1 (infinite)")
@@ -855,7 +827,7 @@ func NewClient[TTx any](driver riverdriver.Driver[TTx], config *Config) (*Client
855827
}
856828

857829
var (
858-
configuredMiddleware = middlewareFromConfig(config)
830+
configuredMiddleware = pluginconfig.Middleware(config.Middleware, config.JobInsertMiddleware, config.WorkerMiddleware)
859831
plugins = append(riverplugin.DefaultPlugins(), config.Plugins...)
860832
allPlugins = pluginlookup.NormalizePlugins(config.Hooks, configuredMiddleware, plugins)
861833
)

internal/pluginconfig/plugin_config.go

Lines changed: 21 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -2,42 +2,31 @@ package pluginconfig
22

33
import "github.com/riverqueue/river/rivertype"
44

5-
// Hooks returns the effective hook list from configured hooks and middleware.
6-
// Explicit hooks are preserved first, followed by middleware that also
7-
// implement hooks.
8-
func Hooks(hooks []rivertype.Hook, middleware []rivertype.Middleware) []rivertype.Hook {
9-
effectiveHooks := make([]rivertype.Hook, 0, len(hooks)+len(middleware))
10-
11-
effectiveHooks = append(effectiveHooks, hooks...)
12-
13-
for _, middlewareItem := range middleware {
14-
hook, ok := middlewareItem.(rivertype.Hook)
15-
if !ok {
16-
continue
17-
}
18-
19-
effectiveHooks = append(effectiveHooks, hook)
5+
// Middleware combines middleware from the current and legacy configuration
6+
// fields into one list. Explicit middleware is preserved first, followed by
7+
// legacy job insert and worker middleware. A worker middleware already present
8+
// in the job insert list is included only once.
9+
func Middleware(middleware []rivertype.Middleware, jobInsertMiddleware []rivertype.JobInsertMiddleware, workerMiddleware []rivertype.WorkerMiddleware) []rivertype.Middleware {
10+
allMiddleware := make([]rivertype.Middleware, 0,
11+
len(middleware)+len(jobInsertMiddleware)+len(workerMiddleware))
12+
allMiddleware = append(allMiddleware, middleware...)
13+
14+
for _, jobInsertMiddlewareItem := range jobInsertMiddleware {
15+
allMiddleware = append(allMiddleware, jobInsertMiddlewareItem)
2016
}
2117

22-
return effectiveHooks
23-
}
24-
25-
// Middleware returns the effective middleware list from configured hooks and
26-
// middleware. Explicit middleware are preserved first, followed by hooks that
27-
// also implement middleware.
28-
func Middleware(hooks []rivertype.Hook, middleware []rivertype.Middleware) []rivertype.Middleware {
29-
effectiveMiddleware := make([]rivertype.Middleware, 0, len(hooks)+len(middleware))
30-
31-
effectiveMiddleware = append(effectiveMiddleware, middleware...)
32-
33-
for _, hook := range hooks {
34-
middlewareItem, ok := hook.(rivertype.Middleware)
35-
if !ok {
36-
continue
18+
outerLoop:
19+
for _, workerMiddlewareItem := range workerMiddleware {
20+
if workerMiddlewareAsJobInsertMiddleware, ok := workerMiddlewareItem.(rivertype.JobInsertMiddleware); ok {
21+
for _, jobInsertMiddlewareItem := range jobInsertMiddleware {
22+
if workerMiddlewareAsJobInsertMiddleware == jobInsertMiddlewareItem {
23+
continue outerLoop
24+
}
25+
}
3726
}
3827

39-
effectiveMiddleware = append(effectiveMiddleware, middlewareItem)
28+
allMiddleware = append(allMiddleware, workerMiddlewareItem)
4029
}
4130

42-
return effectiveMiddleware
31+
return allMiddleware
4332
}
Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
package pluginconfig
2+
3+
import (
4+
"testing"
5+
6+
"github.com/stretchr/testify/require"
7+
8+
"github.com/riverqueue/river/rivertype"
9+
)
10+
11+
func TestMiddleware(t *testing.T) {
12+
t.Parallel()
13+
14+
t.Run("CombinesMiddlewareInOrder", func(t *testing.T) {
15+
t.Parallel()
16+
17+
var (
18+
middleware = &testMiddleware{}
19+
jobInsertMiddleware = &testJobInsertMiddleware{}
20+
workerMiddleware = &testWorkerMiddleware{}
21+
)
22+
23+
require.Equal(t, []rivertype.Middleware{
24+
middleware,
25+
jobInsertMiddleware,
26+
workerMiddleware,
27+
}, Middleware(
28+
[]rivertype.Middleware{middleware},
29+
[]rivertype.JobInsertMiddleware{jobInsertMiddleware},
30+
[]rivertype.WorkerMiddleware{workerMiddleware},
31+
))
32+
})
33+
34+
t.Run("SameSpecificMiddlewareIncludedOnce", func(t *testing.T) {
35+
t.Parallel()
36+
37+
middleware := &testJobInsertAndWorkerMiddleware{}
38+
39+
require.Equal(t, []rivertype.Middleware{middleware}, Middleware(
40+
nil,
41+
[]rivertype.JobInsertMiddleware{middleware},
42+
[]rivertype.WorkerMiddleware{middleware},
43+
))
44+
})
45+
}
46+
47+
type testJobInsertAndWorkerMiddleware struct {
48+
rivertype.JobInsertMiddleware
49+
rivertype.WorkerMiddleware
50+
}
51+
52+
func (*testJobInsertAndWorkerMiddleware) IsMiddleware() bool { return true }
53+
54+
type testJobInsertMiddleware struct {
55+
rivertype.JobInsertMiddleware
56+
}
57+
58+
type testMiddleware struct{}
59+
60+
func (*testMiddleware) IsMiddleware() bool { return true }
61+
62+
type testWorkerMiddleware struct {
63+
rivertype.WorkerMiddleware
64+
}

rivertest/worker.go

Lines changed: 8 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import (
1111
"github.com/riverqueue/river/internal/jobcompleter"
1212
"github.com/riverqueue/river/internal/jobexecutor"
1313
"github.com/riverqueue/river/internal/maintenance"
14+
"github.com/riverqueue/river/internal/pluginconfig"
1415
"github.com/riverqueue/river/internal/pluginlookup"
1516
"github.com/riverqueue/river/internal/riverplugin"
1617
"github.com/riverqueue/river/riverdriver"
@@ -147,9 +148,13 @@ func (w *Worker[T, TTx]) workJob(ctx context.Context, tb testing.TB, tx TTx, job
147148
completer := jobcompleter.NewInlineCompleter(archetype, w.config.Schema, exec, w.client.Pilot(), subscribeCh)
148149

149150
var (
150-
configuredMiddleware = middlewareFromConfig(w.config)
151-
plugins = append(riverplugin.DefaultPlugins(), w.config.Plugins...)
152-
allPlugins = pluginlookup.NormalizePlugins(
151+
configuredMiddleware = pluginconfig.Middleware(
152+
w.config.Middleware, //nolint:staticcheck // Bridge legacy middleware into the test worker's unified plugin path.
153+
w.config.JobInsertMiddleware, //nolint:staticcheck // Bridge legacy middleware into the test worker's unified plugin path.
154+
w.config.WorkerMiddleware, //nolint:staticcheck // Bridge legacy middleware into the test worker's unified plugin path.
155+
)
156+
plugins = append(riverplugin.DefaultPlugins(), w.config.Plugins...)
157+
allPlugins = pluginlookup.NormalizePlugins(
153158
w.config.Hooks, //nolint:staticcheck // Bridge legacy Hooks into the test worker's unified plugin path.
154159
configuredMiddleware,
155160
plugins,
@@ -238,36 +243,6 @@ func (w *Worker[T, TTx]) workJob(ctx context.Context, tb testing.TB, tx TTx, job
238243
panic("unreachable")
239244
}
240245

241-
//nolint:staticcheck
242-
func middlewareFromConfig(config *river.Config) []rivertype.Middleware {
243-
middleware := make([]rivertype.Middleware, 0,
244-
len(config.Middleware)+len(config.JobInsertMiddleware)+len(config.WorkerMiddleware))
245-
middleware = append(middleware, config.Middleware...)
246-
247-
for _, jobInsertMiddleware := range config.JobInsertMiddleware {
248-
middleware = append(middleware, jobInsertMiddleware)
249-
}
250-
251-
outerLoop:
252-
for _, workerMiddleware := range config.WorkerMiddleware {
253-
// Don't add the middleware if it also implements JobInsertMiddleware
254-
// and the instance has been added to config.JobInsertMiddleware. This
255-
// is a hedge to make sure we don't accidentally double add middleware
256-
// as we've converted over to the unified config.Middleware setting.
257-
if workerMiddlewareAsJobInsertMiddleware, ok := workerMiddleware.(rivertype.JobInsertMiddleware); ok {
258-
for _, jobInsertMiddleware := range config.JobInsertMiddleware {
259-
if workerMiddlewareAsJobInsertMiddleware == jobInsertMiddleware {
260-
continue outerLoop
261-
}
262-
}
263-
}
264-
265-
middleware = append(middleware, workerMiddleware)
266-
}
267-
268-
return middleware
269-
}
270-
271246
// WorkResult is the result of working a job in the test Worker.
272247
type WorkResult struct {
273248
// EventKind is the kind of event that occurred following execution.

0 commit comments

Comments
 (0)