leblebijs/src/core/bufferedServer.ts

57 lines
1.4 KiB
TypeScript

import { Logger } from "tslog";
import type { Server } from "../compose";
import type { CoreRequest } from "./server";
export type Request = Omit<CoreRequest, "response">;
export type BufferedResponse = {
status: number;
body: string;
};
export function bufferedResponse(
app: Server<Request, BufferedResponse | undefined>,
): Server<CoreRequest, void> {
return async function bufferedResp(request) {
const out = await app(request);
if (out) {
request.response.statusCode = out.status;
request.response.write(out.body);
} else {
request.response.statusCode = 500;
}
};
}
export type BufferedRequest = Request & {
body: string;
};
export function bufferedRequest<Response>(
app: Server<BufferedRequest, Response>,
): Server<Request, Response | undefined> {
return function bufferedReq(request) {
const logger = new Logger();
let body = "";
const response = new Promise<Response | undefined>((resolve) => {
request.request.on("data", (chunk) => {
body += chunk.toString();
});
request.request.on("end", () => {
app({
...request,
body,
})
.then((out) => {
resolve(out);
})
.catch((err) => {
logger.error("App did not return a response", err);
resolve(undefined);
});
});
});
return response;
};
}