MCPcopy Create free account
hub / github.com/TanStack/router / executeMiddleware

Function executeMiddleware

packages/start-client-core/src/createServerFn.ts:228–369  ·  view source on GitHub ↗
(
  middlewares: Array<AnyFunctionMiddleware | AnyRequestMiddleware>,
  env: 'client' | 'server',
  opts: ServerFnMiddlewareOptions,
)

Source from the content-addressed store, hash-verified

226}
227
228export async function executeMiddleware(
229 middlewares: Array<AnyFunctionMiddleware | AnyRequestMiddleware>,
230 env: 'client' | 'server',
231 opts: ServerFnMiddlewareOptions,
232): Promise<ServerFnMiddlewareResult> {
233 const globalMiddlewares = getStartOptions()?.functionMiddleware || []
234 let flattenedMiddlewares = flattenMiddlewares([
235 ...globalMiddlewares,
236 ...middlewares,
237 ])
238
239 // On server, filter out middlewares that already executed in the request phase
240 // to prevent duplicate execution (issue #5239)
241 if (env === 'server') {
242 const startContext = getStartContextServerOnly({ throwIfNotFound: false })
243 if (startContext?.executedRequestMiddlewares) {
244 flattenedMiddlewares = flattenedMiddlewares.filter(
245 (m) => !startContext.executedRequestMiddlewares.has(m),
246 )
247 }
248 }
249
250 const callNextMiddleware: NextFn = async (ctx) => {
251 // Get the next middleware
252 const nextMiddleware = flattenedMiddlewares.shift()
253
254 // If there are no more middlewares, return the context
255 if (!nextMiddleware) {
256 return ctx
257 }
258
259 // Execute the middleware
260 try {
261 let validator =
262 'validator' in nextMiddleware.options
263 ? nextMiddleware.options.validator
264 : undefined
265
266 // TODO remove upon stable
267 if (!validator && 'inputValidator' in nextMiddleware.options) {
268 validator = nextMiddleware.options.inputValidator
269 }
270
271 if (validator && env === 'server') {
272 // Execute the middleware's input function
273 ctx.data = await execValidator(validator as AnyValidator, ctx.data)
274 }
275
276 let middlewareFn: MiddlewareFn | undefined = undefined
277 if (env === 'client') {
278 if ('client' in nextMiddleware.options) {
279 middlewareFn = nextMiddleware.options.client as
280 | MiddlewareFn
281 | undefined
282 }
283 }
284 // env === 'server'
285 else if ('server' in nextMiddleware.options) {

Callers 1

createServerFnFunction · 0.70

Calls 5

createNullProtoObjectFunction · 0.90
flattenMiddlewaresFunction · 0.85
callNextMiddlewareFunction · 0.85
filterMethod · 0.80
hasMethod · 0.45

Tested by

no test coverage detected