leblebijs/src/core/bufferedServer.ts

57 lines
1.4 KiB
TypeScript
Raw Normal View History

2022-05-21 21:36:48 -05:00
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(
2022-05-21 23:20:58 -05:00
app: Server<Request, BufferedResponse | undefined>,
2022-05-21 21:36:48 -05:00
): Server<CoreRequest, void> {
return async function bufferedResp(request) {
const out = await app(request);
2022-05-21 23:20:58 -05:00
if (out) {
request.response.statusCode = out.status;
request.response.write(out.body);
} else {
request.response.statusCode = 500;
}
2022-05-21 21:36:48 -05:00
};
}
export type BufferedRequest = Request & {
body: string;
};
export function bufferedRequest<Response>(
app: Server<BufferedRequest, Response>,
2022-05-21 23:20:58 -05:00
): Server<Request, Response | undefined> {
2022-05-21 21:36:48 -05:00
return function bufferedReq(request) {
const logger = new Logger();
let body = "";
2022-05-21 23:20:58 -05:00
const response = new Promise<Response | undefined>((resolve) => {
2022-05-21 21:36:48 -05:00
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;
};
}