57 lines
1.4 KiB
TypeScript
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;
|
|
};
|
|
}
|