mirror of https://github.com/186526/handlers.js
54 lines
1.5 KiB
TypeScript
54 lines
1.5 KiB
TypeScript
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<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> {
|
|
self.addEventListener("fetch", (event: FetchEvent) => {
|
|
event.respondWith(this.handler(event));
|
|
});
|
|
}
|
|
|
|
async handleRequest(nativeRequest: Request): Promise<request<T>> {
|
|
const requestHeaders = new headers(
|
|
Object.fromEntries(nativeRequest.headers.entries())
|
|
);
|
|
const requestMessage: request<T> = new request(
|
|
<methodENUM>nativeRequest.method,
|
|
new URL(nativeRequest.url),
|
|
requestHeaders,
|
|
await nativeRequest.text(),
|
|
{},
|
|
requestHeaders.get("CF-Connecting-IP") || ""
|
|
);
|
|
return requestMessage;
|
|
}
|
|
|
|
async handleResponse(response: response<K>): Promise<Response> {
|
|
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<Response> {
|
|
return await this.handleResponse(
|
|
await this.handleRequest(event.request).then((request) =>
|
|
this.router.respond(request)
|
|
)
|
|
)
|
|
}
|
|
}
|