import { Context } from "./context.ts";import { compose, Middleware } from "./middleware.ts";import { HTTPSOptions, serve, serveTLS } from "./deps.ts";
export class Application<S extends object = { [key: string]: any }> { private _middleware: Middleware<S, Context<S>>[] = [];
state = {} as S;
constructor(private _serve = serve, private _serveTLS = serveTLS) {}
async listen(addr: string | Deno.ListenOptions): Promise<void> { const middleware = compose<S, Context<S>>(this._middleware); const server = this._serve(addr); for await (const request of server) { const context = new Context<S>(this, request); await middleware(context); await request.respond(context.response.toServerResponse()); } }
async listenTLS(options: HTTPSOptions): Promise<void> { const middleware = compose<S, Context<S>>(this._middleware); const server = this._serveTLS(options); for await (const request of server) { const context = new Context<S>(this, request); await middleware(context); await request.respond(context.response.toServerResponse()); } }
use(...middleware: Middleware<S, Context<S>>[]): this { this._middleware.push(...middleware); return this; }}