mirror of
https://github.com/186526/handlers.js
synced 2024-10-13 00:29:43 +00:00
Add CI & Deno Supported & Fix a lot of bugs & Webpack for building package
This commit is contained in:
@ -1 +0,0 @@
|
||||
console.log("Hello World!");
|
@ -3,6 +3,5 @@ export { response } from "./response";
|
||||
export { method } from "./method";
|
||||
export { headers } from "./headers";
|
||||
export { responder } from "./responder";
|
||||
export const ChainInterrupted = new Error("ChainInterrupted");
|
||||
export const AllMismatchInterrupted = new Error("AllMismatchInterrupted");
|
||||
export type path = string | RegExp;
|
||||
|
@ -56,6 +56,6 @@ export enum methodENUM {
|
||||
ANY = "ANY",
|
||||
}
|
||||
|
||||
export type method = methodENUM | string;
|
||||
export type method = "CONNECT" | "DELETE" | "GET" | "HEAD" | "OPTIONS" | "PATCH" | "POST" | "PUT" | "TRACE" | "ANY" | methodENUM;
|
||||
|
||||
export default method;
|
16
src/lib.ts
16
src/lib.ts
@ -4,17 +4,23 @@ export const platform = (() => {
|
||||
if (typeof process != "undefined") {
|
||||
return "Node.js";
|
||||
}
|
||||
if (typeof self != "undefined") {
|
||||
return "Web Worker";
|
||||
if (typeof Deno != "undefined") {
|
||||
return "Deno";
|
||||
}
|
||||
|
||||
return "Unknown";
|
||||
if (typeof self != "undefined") {
|
||||
return "Service Worker";
|
||||
}
|
||||
return undefined;
|
||||
})();
|
||||
export const version = (() => {
|
||||
switch (platform) {
|
||||
case "Node.js":
|
||||
return process.version;
|
||||
case "Deno":
|
||||
return Deno.version.deno;
|
||||
case "Service Worker":
|
||||
return undefined;
|
||||
default:
|
||||
return "Unknown";
|
||||
return undefined;
|
||||
}
|
||||
})();
|
||||
|
67
src/platform/deno.ts
Normal file
67
src/platform/deno.ts
Normal 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)
|
||||
)
|
||||
)
|
||||
}
|
||||
}
|
@ -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 };
|
||||
|
@ -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>;
|
||||
|
@ -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"}`
|
||||
|
@ -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(),
|
||||
|
@ -3,7 +3,6 @@ import {
|
||||
path,
|
||||
response,
|
||||
request,
|
||||
ChainInterrupted,
|
||||
AllMismatchInterrupted,
|
||||
responder,
|
||||
method,
|
||||
@ -132,8 +131,8 @@ export class router<K = any, V = any> {
|
||||
throw AllMismatchInterrupted;
|
||||
}
|
||||
} catch (e) {
|
||||
if (e === ChainInterrupted) {
|
||||
return e.response;
|
||||
if (e instanceof response) {
|
||||
throw e;
|
||||
}
|
||||
if (e === AllMismatchInterrupted) mismatchCount++;
|
||||
else {
|
||||
@ -183,16 +182,16 @@ export class rootRouter<K = any, V = any> extends router<K, V> {
|
||||
public adapater: platformAdapater<K, V>;
|
||||
errorResponder =
|
||||
(errorCode: number, errorMessage?: string) =>
|
||||
async (_request: request<K>): Promise<response<V>> =>
|
||||
new response(errorMessage ?? "", errorCode);
|
||||
async (_request: request<K>): Promise<response<V>> =>
|
||||
new response(errorMessage ?? "", errorCode);
|
||||
|
||||
respond = async (request: request<K>): Promise<response<V>> => {
|
||||
let responseMessage: response<V> = new response("");
|
||||
try {
|
||||
responseMessage = await this._respond(request, responseMessage);
|
||||
} catch (e) {
|
||||
if (e === ChainInterrupted) {
|
||||
return responseMessage;
|
||||
if (e instanceof response) {
|
||||
return e;
|
||||
} else if (e === AllMismatchInterrupted) {
|
||||
responseMessage =
|
||||
(await this.errorResponder(404, "404 Not Found\n")(request)) ??
|
||||
@ -214,7 +213,8 @@ export class rootRouter<K = any, V = any> extends router<K, V> {
|
||||
useMappingAdapter(
|
||||
mapping: { [platform: string]: platformAdapaterConstructor } = platformAdapaterMapping
|
||||
): this {
|
||||
if(mapping[platform] == undefined) throw new Error("Platform not found in mapping");
|
||||
if (typeof platform == "undefined") throw new Error("Cannot detect platform");
|
||||
if (mapping[platform] == undefined) throw new Error("Platform not found in mapping");
|
||||
else this.useAdapater(mapping[platform]);
|
||||
return this;
|
||||
}
|
||||
|
Reference in New Issue
Block a user