Skip to content

Instantly share code, notes, and snippets.

@aselbie
Created April 17, 2020 02:06
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save aselbie/71d92c087e1276d3269e499cb5e14323 to your computer and use it in GitHub Desktop.
Save aselbie/71d92c087e1276d3269e499cb5e14323 to your computer and use it in GitHub Desktop.
type Middleware<In, Out> = <T extends In>(req: Request, res: Response, state: T) => Promise<T & Out>;
export const fooMiddleware: Middleware<{}, { foo: string }> = async (req, res, state) => {
return { ...state, foo: "foo" };
};
export const barMiddleware: Middleware<{}, { bar: string }> = async (req, res, state) => {
return { ...state, bar: "bar" };
};
export const foobarMiddleware: Middleware<{ foo: string; bar: string }, {}> = async (req, res, state) => {
res.send(`hello ${state.foo} ${state.bar}`);
return state;
};
const pipe = (...middlewares: Middleware<any, any>[]) => async (req: Request, res: Response) => {
middlewares.reduce(
async (statePromise, middleware) => await middleware(req, res, await statePromise),
Promise.resolve({})
);
};
// This is typesafe
app.get("/", async (req: Request, res: Response) => {
await foobarMiddleware(req, res, await barMiddleware(req, res, await fooMiddleware(req, res, {})));
});
// This is not :(
app.get("/", pipe(fooMiddleware, barMiddleware, foobarMiddleware));
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment