Skip to content

Instantly share code, notes, and snippets.

@nuintun
Last active May 9, 2023 02:31
Show Gist options
  • Save nuintun/e249c61a897e1c5c7132f02b9018e603 to your computer and use it in GitHub Desktop.
Save nuintun/e249c61a897e1c5c7132f02b9018e603 to your computer and use it in GitHub Desktop.
koa-compose TypeScript 实现
/**
* @module compose
*/
export interface Next {
(): Promise<void>;
}
export interface Composed<C> {
(context: C, next?: Next): Promise<void>;
}
export interface Middleware<C> {
(context: C, next: Next): Promise<void> | void;
}
/**
* @function compose
* @description compose koa middlewares
* @param {function[]} middlewares
* @returns {function}
*/
export default function compose<C>(middlewares: Middleware<C>[]): Composed<C> {
const done = async (): Promise<void> => {};
const compose = middlewares.reduce((compose, middleware) => {
return (context, next) => {
return compose(context, async () => {
middleware(context, next);
});
};
});
return async (context, next = done) => {
return compose ? compose(context, next) : next();
};
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment