Skip to content

Instantly share code, notes, and snippets.

@mary-ext
Last active January 14, 2025 07:24
Show Gist options
  • Save mary-ext/5f46b4598ecd82d7f98d512e80fac7c3 to your computer and use it in GitHub Desktop.
Save mary-ext/5f46b4598ecd82d7f98d512e80fac7c3 to your computer and use it in GitHub Desktop.
Middleware-style hook runner
type Middleware<TParams extends any[], TReturn> = (
...params: [...TParams, next: (...params: TParams) => TReturn]
) => TReturn;
const exhausted = () => {
throw new Error('middleware chain exhausted');
};
export const createMiddlewareRunner = <TParams extends any[], TReturn>(
middlewares: [...Middleware<TParams, TReturn>[], Middleware<TParams, TReturn>],
) => {
// prettier-ignore
return middlewares.reduceRight<(...params: TParams) => TReturn>(
(next, run) => (...args) => run(...args, next),
exhausted,
);
};
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment