leblebijs/src/core/bufferedServer.ts

53 lines
1.3 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>,
): Server<CoreRequest, void> {
return async function bufferedResp(request) {
const out = await app(request);
request.response.statusCode = out.status;
request.response.write(out.body);
};
}
export type BufferedRequest = Request & {
body: string;
};
export function bufferedRequest<Response>(
app: Server<BufferedRequest, Response>,
): Server<Request, Response> {
return function bufferedReq(request) {
const logger = new Logger();
let body = "";
const response = new Promise<Response>((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;
};
}