deno的koa框架oak

https://github.com/kitsonk/oak

node ==> deno || || koa ==> oak

名字只是调换了字母的顺序

代码更加精简,惊叹deno的更新速度,越来越完善

核心代码只有 application.ts,compose原来是外部引用的,现在直接写在里面。

/* application.ts */
import { Context } from "./context";
import { serve } from "./deps";

export interface Middleware {
  (context: Context, next: () => Promise<void>): Promise<void> | void;
}

function compose(
  middleware: Middleware[]
): (context: Context) => Promise<void> {
  return function(context: Context, next?: () => Promise<void>) {
    let index = -1;
    async function dispatch(i: number) {
      if (i <= index) {
        throw new Error("next() called multiple times.");
      }
      index = i;
      let fn: Middleware | undefined = middleware[i];
      if (i === middleware.length) {
        fn = next;
      }
      if (!fn) {
        return;
      }
      return fn(context, dispatch.bind(null, i + 1));
    }
    return dispatch(0);
  };
}

export class Application {
  private _middleware: Middleware[] = [];

  async listen(addr: string): Promise<void> {
    const middleware = compose(this._middleware);
    const server = serve(addr);
    for await (const request of server) {
      const context = new Context(request);
      await middleware(context);
      await request.respond(context.response.toServerResponse());
    }
  }

  use(middleware: Middleware): this {
    this._middleware.push(middleware);
    return this;
  }
}