import { platformAdapater } from "./index"; import { request } from "../interface/request"; import { response } from "../interface/response"; import { router } from "../router"; import { headers } from "../interface/headers"; import { methodENUM } from "src/interface/method"; export class SWPlatformAdapter implements platformAdapater { public router: router; constructor(router: router) { this.router = router; } async listen(_port?: number): Promise { self.addEventListener("fetch", (event: FetchEvent) => { event.respondWith(this.handler(event)); }); } async handleRequest(nativeRequest: Request): Promise> { const requestHeaders = new headers( Object.fromEntries(nativeRequest.headers.entries()) ); const requestMessage: request = new request( nativeRequest.method, new URL(nativeRequest.url), requestHeaders, await nativeRequest.text(), {}, requestHeaders.get("CF-Connecting-IP") || "" ); return requestMessage; } async handleResponse(response: response): Promise { if (response.status === 204) { response.body = null; } const nativResponse = new Response(response.body, { status: response.status, headers: response.headers.headers, }); return nativResponse; } async handler(event: FetchEvent): Promise { return await this.handleResponse( await this.handleRequest(event.request).then((request) => this.router.respond(request) ) ) } }