diff --git a/deno/app.ts b/deno/app.ts
new file mode 100644
index 0000000..db71c60
--- /dev/null
+++ b/deno/app.ts
@@ -0,0 +1,45 @@
+// app.ts
+
+import { services } from "./services";
+import{DenoRequest, Method, ProcessedRoute, Request, Route} from './types'
+
+import {routes} from './routes'
+
+services.logging.log({ foo: 1 });
+const processedRoutes: ProcessedRoute[] = routes.map(
+ (route: Route, idx: number, allRoutes: Route[]) => {
+ const pattern: URLPattern = new URLPattern({ pathname: route.path });
+ const method: Method = route.method;
+ const handler = async (denoRequest: DenoRequest) => {
+ const req: Request = {
+ pattern: route.pattern,
+ path: denoRequest.path,
+ method: denoRequest.method,
+ parameters: { one: 1, two: 2 },
+ denoRequest,
+ };
+ return route.handler(req);
+ };
+
+ const retval: ProcessedRoute = { pattern, method, handler };
+
+ return retval
+ },
+);
+
+
+async function handler(req: globalThis.Request): globalThis.Response {
+ for (const [idx, pr] of processedRoutes.entries()) {
+ const match = pr.pattern.exec(req.url);
+ if (match) {
+ const resp = await pr.handler(req);
+
+ return new globalThis.Response(resp.result);
+ }
+ }
+
+ return new globalThis.Response("not found", { status: 404 });
+}
+
+Deno.serve(handler);
+
diff --git a/deno/routes.ts b/deno/routes.ts
index 5f0f4e7..c94b24a 100644
--- a/deno/routes.ts
+++ b/deno/routes.ts
@@ -1,18 +1,16 @@
-type Method = "get" | "post" | "put" | "patch" | "delete";
+///
+
+import { sleep } from "https://deno.land/x/sleep/mod.ts";
import { HttpCode, httpCodes } from "./http-codes.ts";
import { ContentType, contentTypes } from "./content-types";
import { services } from "./services";
+import {DenoRequest, Handler, Response, Method, UserRequest, Request, Route, ProcessedRoute } from './types.ts'
-type Response = {
- code: HttpCode;
- contentType: ContentType;
- result: string;
-};
-type Handler = (req: Request) => Response;
-const phandler: Handler = (req: Request) => {
+
+const phandler: Handler = async (req: Request) => {
const code = httpCodes.success.OK;
return {
code,
@@ -21,17 +19,54 @@ const phandler: Handler = (req: Request) => {
};
};
-type Route = {
- path: string;
- methods: Method[];
- handler: Handler;
+
+
+// FIXME: Obviously put this somewhere else
+const okText = (out: string) => {
+ const code = httpCodes.success.OK;
+
+ return {
+ code,
+ result: out,
+ contentType: contentTypes.text.plain,
+ };
};
const routes: Route[] = [
+ {
+ path: "/slow",
+ methods: ["get"],
+ handler: async (_req) => {
+ console.log("starting slow request") ;
+ await sleep(10);
+ console.log("finishing slow request"); return okText("that was slow");
+ },
+ },
+ {
+ path: "/list",
+ methods: ["get"],
+ handler: async (_req) => {
+ const code = httpCodes.success.OK;
+ const lr = (rr: Route[]) => {
+ const ret = rr.map((r: Route) => {
+ return r.path;
+ });
+
+ return ret;
+ };
+
+ const listing = lr(routes).join(", ");
+ return {
+ code,
+ result: listing + "\n",
+ contentType: contentTypes.text.plain,
+ };
+ },
+ },
{
path: "/ok",
methods: ["get"],
- handler: (req) => {
+ handler: async (_req) => {
const code = httpCodes.success.OK;
const rn = services.random.randomNumber();
@@ -45,7 +80,7 @@ const routes: Route[] = [
{
path: "/alsook",
methods: ["get"],
- handler: (req) => {
+ handler: async (_req) => {
const code = httpCodes.success.OK;
return {
code,
@@ -56,46 +91,11 @@ const routes: Route[] = [
},
];
-type DenoRequest = globalThis.Request;
-type UserRequest = {};
-type Request = {
- pattern: string;
- path: string;
- method: Method;
- parameters: object;
- denoRequest: globalThis.Request;
-};
-type ProcessedRoute = { pattern: URLPattern; method: Method; handler: Handler };
-const processedRoutes: ProcessedRoute[] = routes.map(
- (route: Route, idx: number, allRoutes: Route[]) => {
- const pattern: URLPattern = new URLPattern({ pathname: route.path });
- const method: Method = route.method;
- const handler = (denoRequest: DenoRequest) => {
- const req: Request = {
- pattern: route.pattern,
- path: denoRequest.path,
- method: denoRequest.method,
- parameters: { one: 1, two: 2 },
- denoRequest,
- };
- return route.handler(req);
- };
- return { pattern, method, handler };
- },
-);
-function handler(req: globalThis.Request): globalThis.Response {
- for (const [idx, pr] of processedRoutes.entries()) {
- const match = pr.pattern.exec(req.url);
- if (match) {
- const resp = pr.handler(req);
- return new globalThis.Response(resp.result);
- }
- }
- return new globalThis.Response("not found", { status: 404 });
-}
-Deno.serve(handler);
+
+
+ export {routes}
diff --git a/deno/run.sh b/deno/run.sh
index 7dbcf2c..713aad1 100755
--- a/deno/run.sh
+++ b/deno/run.sh
@@ -6,6 +6,6 @@ DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
cd "$DIR"
-deno run --allow-net --unstable-sloppy-imports --watch routes.ts
+deno run --allow-net --unstable-sloppy-imports --watch app.ts
diff --git a/deno/types.ts b/deno/types.ts
new file mode 100644
index 0000000..c99938c
--- /dev/null
+++ b/deno/types.ts
@@ -0,0 +1,40 @@
+// types.ts
+
+// FIXME: split this up into types used by app developers and types internal
+// to the framework.
+
+
+import { HttpCode, httpCodes } from "./http-codes.ts";
+import { ContentType, contentTypes } from "./content-types";
+
+
+export type Method = "get" | "post" | "put" | "patch" | "delete";
+
+
+export type DenoRequest = globalThis.Request;
+export type UserRequest = {};
+export type Request = {
+ pattern: string;
+ path: string;
+ method: Method;
+ parameters: object;
+ denoRequest: globalThis.Request;
+};
+export type ProcessedRoute = { pattern: URLPattern; method: Method; handler: Handler };
+
+
+
+export type Response = {
+ code: HttpCode;
+ contentType: ContentType;
+ result: string;
+};
+
+export type Handler = (req: Request) => Promise;
+
+export type Route = {
+ path: string;
+ methods: Method[];
+ handler: Handler;
+ interruptable?: boolean
+};
\ No newline at end of file