abi.js
Version:
[![typescript-icon]][typescript-link] [![license-icon]][license-link] [![status-icon]][status-link] [![ci-icon]][ci-link] [![twitter-icon]][twitter-link]
85 lines (65 loc) • 1.79 kB
text/typescript
import type { Method } from './method';
import type { Logger, Result } from './types';
export class Context {
constructor(
readonly request: Request,
readonly logger: Logger = console,
) {}
get url(): URL {
return new URL(this.request.url);
}
get method(): Method {
return this.request.method;
}
get pathname(): string {
return decodeURIComponent(this.url.pathname);
}
respond(
body?: BodyInit | null,
headers?: HeadersInit,
status?: number,
statusText?: string,
): Response {
return new Response(body, { status, statusText, headers });
}
redirect(location: string | URL, status?: number): Response {
return Response.redirect(location, status);
}
json<T>(): T;
json<T>(body?: T, init?: ResponseInit): Response;
json(arg1?: any, arg2?: any): any {
if (arg1 === undefined && arg2 === undefined) {
return this.request.json();
}
return new Response(JSON.stringify(arg1), arg2);
}
text(body: string, init?: ResponseInit): Response {
return new Response(body, init);
}
public render(result: Result): Response {
if (result instanceof Response) {
return result;
}
if (typeof result === 'string') {
return this.text(result);
}
if (typeof result === 'number') {
return this.respond(null, {}, result);
}
return this.json(result);
}
abort(code = 500, message?: string, headers?: HeadersInit): Response {
const err = `Error ${code}${message ? `: ${message}` : ''}`;
this.logger.error(err);
return this.respond(err, headers, code);
}
log(...args: any[]) {
this.logger.log(...args);
}
warn(...args: any[]) {
this.logger.warn(...args);
}
error(...args: any[]) {
this.logger.error(...args);
}
}