2022-06-29 20:00:52 +00:00
|
|
|
import { platformAdapater } from "./index";
|
2022-07-02 17:01:00 +00:00
|
|
|
import { request, response } from "../interface/index";
|
2022-06-29 20:00:52 +00:00
|
|
|
import { router } from "../router";
|
2022-06-29 15:00:01 +00:00
|
|
|
import { headers } from "../interface/headers";
|
|
|
|
|
2022-06-28 16:22:49 +00:00
|
|
|
import http from "http";
|
2022-07-02 17:01:00 +00:00
|
|
|
import { methodENUM } from "src/interface/method";
|
2022-06-28 16:22:49 +00:00
|
|
|
|
2022-06-29 15:00:01 +00:00
|
|
|
export class NodePlatformAdapter<T = any, K = any> implements platformAdapater {
|
|
|
|
public router: router<T, K>;
|
|
|
|
|
|
|
|
constructor(router: router<T, K>) {
|
|
|
|
this.router = router;
|
|
|
|
}
|
|
|
|
|
|
|
|
async listen(port: number): Promise<void> {
|
2022-06-28 16:22:49 +00:00
|
|
|
const server = http.createServer();
|
|
|
|
server.on(
|
|
|
|
"request",
|
2022-06-29 15:00:01 +00:00
|
|
|
async (req: http.IncomingMessage, res: http.ServerResponse) => {
|
|
|
|
const request = await this.handleRequest(req);
|
|
|
|
const response = await this.router.respond(request);
|
|
|
|
this.handleResponse(response, res);
|
2022-06-28 16:22:49 +00:00
|
|
|
}
|
|
|
|
);
|
|
|
|
server.listen(port);
|
2022-06-29 15:00:01 +00:00
|
|
|
return;
|
2022-06-28 16:22:49 +00:00
|
|
|
}
|
|
|
|
|
2022-06-29 15:00:01 +00:00
|
|
|
async handleRequest(
|
|
|
|
nativeRequest: http.IncomingMessage
|
|
|
|
): Promise<request<T>> {
|
|
|
|
if (
|
|
|
|
typeof nativeRequest.method != "string" ||
|
|
|
|
typeof nativeRequest.url != "string" ||
|
|
|
|
typeof nativeRequest.headers != "object"
|
|
|
|
) {
|
|
|
|
throw new Error("Invalid request");
|
|
|
|
}
|
|
|
|
|
|
|
|
let body: string = "";
|
2022-07-02 17:01:00 +00:00
|
|
|
const ip: string = nativeRequest.socket.remoteAddress?.replace("::ffff:", "") ?? "0.0.0.0";
|
2022-06-29 15:00:01 +00:00
|
|
|
const requestHeaders = new headers(<any>nativeRequest.headers);
|
|
|
|
|
|
|
|
if (!["GET", "HEAD", "DELETE", "OPTIONS"].includes(nativeRequest.method)) {
|
|
|
|
nativeRequest.on("data", (data: string) => {
|
|
|
|
body += data;
|
|
|
|
});
|
|
|
|
|
|
|
|
await new Promise((resolve) =>
|
|
|
|
nativeRequest.on("end", () => {
|
|
|
|
resolve(true);
|
|
|
|
})
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
return new request<T>(
|
2022-07-02 17:01:00 +00:00
|
|
|
<methodENUM>nativeRequest.method,
|
2022-06-29 15:00:01 +00:00
|
|
|
new URL(
|
|
|
|
nativeRequest.url,
|
|
|
|
`http://${requestHeaders.get("host") ?? "localhost"}`
|
|
|
|
),
|
|
|
|
requestHeaders,
|
|
|
|
body,
|
|
|
|
{},
|
|
|
|
ip
|
|
|
|
);
|
2022-06-28 16:22:49 +00:00
|
|
|
}
|
|
|
|
|
2022-06-29 15:00:01 +00:00
|
|
|
handleResponse(response: response<K>, nativeResponse: http.ServerResponse) {
|
|
|
|
nativeResponse.statusCode = response.status;
|
|
|
|
response.headers.forEach((key, value) => {
|
|
|
|
nativeResponse.setHeader(key, value);
|
|
|
|
});
|
|
|
|
nativeResponse.end(response.body);
|
2022-06-28 16:22:49 +00:00
|
|
|
}
|
|
|
|
}
|