( middlewares: Array<AnyFunctionMiddleware | AnyRequestMiddleware>, env: 'client' | 'server', opts: ServerFnMiddlewareOptions, )
| 226 | } |
| 227 | |
| 228 | export 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) { |
no test coverage detected