MCPcopy Create free account
hub / github.com/riverqueue/river / MiddlewareChain

Function MiddlewareChain

internal/execution/execution.go:17–42  ·  view source on GitHub ↗

MiddlewareChain chains together the given middleware functions, returning a single function that applies them all in reverse order.

(globalMiddleware []rivertype.Middleware, workerMiddleware []rivertype.WorkerMiddleware, doInner Func, jobRow *rivertype.JobRow)

Source from the content-addressed store, hash-verified

15// MiddlewareChain chains together the given middleware functions, returning a
16// single function that applies them all in reverse order.
17func MiddlewareChain(globalMiddleware []rivertype.Middleware, workerMiddleware []rivertype.WorkerMiddleware, doInner Func, jobRow *rivertype.JobRow) Func {
18 // Quick return for no middleware, which will often be the case.
19 if len(globalMiddleware) < 1 && len(workerMiddleware) < 1 {
20 return doInner
21 }
22
23 // Wrap middlewares in reverse order so the one defined first is wrapped
24 // as the outermost function and is first to receive the operation.
25 for i := len(globalMiddleware) - 1; i >= 0; i-- {
26 middlewareItem := globalMiddleware[i].(rivertype.WorkerMiddleware) //nolint:forcetypeassert // capture the current middleware item
27 previousDoInner := doInner // capture the current doInner function
28 doInner = func(ctx context.Context) error {
29 return middlewareItem.Work(ctx, jobRow, previousDoInner)
30 }
31 }
32
33 for i := len(workerMiddleware) - 1; i >= 0; i-- {
34 middlewareItem := workerMiddleware[i] // capture the current middleware item
35 previousDoInner := doInner // capture the current doInner function
36 doInner = func(ctx context.Context) error {
37 return middlewareItem.Work(ctx, jobRow, previousDoInner)
38 }
39 }
40
41 return doInner
42}

Callers 1

executeMethod · 0.92

Calls 1

WorkMethod · 0.65

Tested by

no test coverage detected

Used in the wild real call sites across dependent graphs

searching dependent graphs…