import { platformAdapater } from "./index"; import { request, response } from "../interface/index"; import { router } from "../router"; import { headers } from "../interface/headers"; import http from "http"; import { methodENUM } from "src/interface/method"; export class NodePlatformAdapter implements platformAdapater { public router: router; constructor(router: router) { this.router = router; } async listen(port: number): Promise { const server = http.createServer(); server.on( "request", async (req: http.IncomingMessage, res: http.ServerResponse) => { const request = await this.handleRequest(req); const response = await this.router.respond(request); this.handleResponse(response, res); } ); server.listen(port); return; } async handleRequest( nativeRequest: http.IncomingMessage ): Promise> { if ( typeof nativeRequest.method != "string" || typeof nativeRequest.url != "string" || typeof nativeRequest.headers != "object" ) { throw new Error("Invalid request"); } let body: string = ""; const ip: string = nativeRequest.socket.remoteAddress?.replace("::ffff:", "") ?? "0.0.0.0"; const requestHeaders = new headers(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( nativeRequest.method, new URL( nativeRequest.url, `http://${requestHeaders.get("host") ?? "localhost"}` ), requestHeaders, body, {}, ip ); } handleResponse(response: response, nativeResponse: http.ServerResponse) { nativeResponse.statusCode = response.status; response.headers.forEach((key, value) => { nativeResponse.setHeader(key, value); }); nativeResponse.end(response.body); } }