import { type Deferred } from "./deps.ts";import type { ServerRequest, ServerRequestBody, UpgradeWebSocketFn, UpgradeWebSocketOptions,} from "./types.d.ts";
const maybeUpgradeWebSocket: UpgradeWebSocketFn | undefined = "upgradeWebSocket" in Deno ? (Deno as any).upgradeWebSocket.bind(Deno) : undefined;
export class HttpRequest implements ServerRequest { #deferred: Deferred<Response>; #request: Request; #resolved = false; #upgradeWebSocket?: UpgradeWebSocketFn;
get remoteAddr(): string | undefined { return undefined; }
get headers(): Headers { return this.#request.headers; }
get method(): string { return this.#request.method; }
get url(): string { try { const url = new URL(this.#request.url); return this.#request.url.replace(url.origin, ""); } catch { } return this.#request.url; }
constructor( request: Request, deferred: Deferred<Response>, upgradeWebSocket?: UpgradeWebSocketFn, ) { this.#deferred = deferred; this.#request = request; this.#upgradeWebSocket = upgradeWebSocket ?? maybeUpgradeWebSocket; }
error(reason?: any): void { if (this.#resolved) { throw new Error("Request already responded to."); } this.#deferred.reject(reason); this.#resolved = true; }
getBody(): ServerRequestBody { return { body: this.#request.body, readBody: async () => { const ab = await this.#request.arrayBuffer(); return new Uint8Array(ab); }, }; }
respond(response: Response): Promise<void> { if (this.#resolved) { throw new Error("Request already responded to."); } this.#deferred.resolve(response); this.#resolved = true; return Promise.resolve(); }
upgrade(options?: UpgradeWebSocketOptions): WebSocket { if (this.#resolved) { throw new Error("Request already responded to."); } if (!this.#upgradeWebSocket) { throw new TypeError("Upgrading web sockets not supported."); } const { response, socket } = this.#upgradeWebSocket(this.#request, options); this.#deferred.resolve(response); return socket; }}