Add CI & Deno Supported & Fix a lot of bugs & Webpack for building package

This commit is contained in:
2022-07-02 17:01:00 +00:00
committed by GitHub
parent b3552cb6a2
commit 057c9b9cb5
25 changed files with 2035 additions and 86 deletions

67
src/platform/deno.ts Normal file
View File

@ -0,0 +1,67 @@
import { SWPlatformAdapter } from "./serviceworker";
import { platformAdapater } from "./index";
import { request } from "../interface/request";
import { headers } from "../interface/headers";
import { methodENUM } from "src/interface/method";
const DefaultConn: Deno.Conn = {
localAddr: {
transport: "tcp",
hostname: "0.0.0.0",
port: 80,
},
remoteAddr: {
transport: "tcp",
hostname: "0.0.0.0",
port: 80,
},
rid: 0,
closeWrite: async () => undefined,
readable: "",
writable: "",
read: async (p: Uint8Array) => null,
write: async (p: Uint8Array) => 0,
close: () => undefined,
};
export class DenoPlatformAdapter<T = any, K = any>
extends SWPlatformAdapter<T, K>
implements platformAdapater<T, K>
{
async listen(port: number): Promise<void> {
const Server: Deno.Listener = Deno.listen({ port });
for await (const connection of Server) {
const httpConnection = Deno.serveHttp(connection);
for await (const requestEvent of httpConnection) {
requestEvent.respondWith(this.handler(requestEvent, connection));
}
}
}
async handleRequest(nativeRequest: Request, connection: Deno.Conn = DefaultConn): 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(),
{},
`${connection.remoteAddr.hostname}:${connection.remoteAddr.port}` || ""
);
return requestMessage;
}
async handler(event: FetchEvent, connection: Deno.Conn = DefaultConn): Promise<Response> {
return await this.handleResponse(
await this.handleRequest(event.request, connection).then((request) =>
this.router.respond(request)
)
)
}
}

View File

@ -1,9 +1,11 @@
import { NodePlatformAdapter } from "./node";
import { SWPlatformAdapter } from "./serviceworker";
import { DenoPlatformAdapter } from "./deno";
export const platformAdapaterMapping = {
"Node.js": NodePlatformAdapter,
"Web Worker": SWPlatformAdapter,
"Service Worker": SWPlatformAdapter,
"Deno": DenoPlatformAdapter,
};
export { NodePlatformAdapter, SWPlatformAdapter };
export { NodePlatformAdapter, SWPlatformAdapter, DenoPlatformAdapter };

View File

@ -1,5 +1,5 @@
import { request, response } from "../interface";
import { router } from "../../index";
import { request, response } from "../interface/index";
import { router } from "../router";
export interface platformAdapater<T = any, K = any> {
router: router<T, K>;

View File

@ -1,9 +1,10 @@
import { platformAdapater } from "./index";
import { request, response } from "../interface";
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<T = any, K = any> implements platformAdapater {
public router: router<T, K>;
@ -38,7 +39,7 @@ export class NodePlatformAdapter<T = any, K = any> implements platformAdapater {
}
let body: string = "";
const ip: string = nativeRequest.socket.remoteAddress?.replace("::ffff:","") ?? "0.0.0.0";
const ip: string = nativeRequest.socket.remoteAddress?.replace("::ffff:", "") ?? "0.0.0.0";
const requestHeaders = new headers(<any>nativeRequest.headers);
if (!["GET", "HEAD", "DELETE", "OPTIONS"].includes(nativeRequest.method)) {
@ -54,7 +55,7 @@ export class NodePlatformAdapter<T = any, K = any> implements platformAdapater {
}
return new request<T>(
nativeRequest.method,
<methodENUM>nativeRequest.method,
new URL(
nativeRequest.url,
`http://${requestHeaders.get("host") ?? "localhost"}`

View File

@ -4,6 +4,8 @@ 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>;
@ -22,7 +24,7 @@ export class SWPlatformAdapter<T = any, K = any> implements platformAdapater {
Object.fromEntries(nativeRequest.headers.entries())
);
const requestMessage: request<T> = new request(
nativeRequest.method,
<methodENUM>nativeRequest.method,
new URL(nativeRequest.url),
requestHeaders,
await nativeRequest.text(),