-
-
Notifications
You must be signed in to change notification settings - Fork 5
/
server.ts
110 lines (103 loc) · 2.88 KB
/
server.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
import { DELETE, GET, OPTIONS, PATCH, POST, PUT } from "./constant.ts";
import { ServeInit, Server } from "./deps.ts";
import { createHandler } from "./handler.ts";
import {
Fastro,
HandlerArgument,
Route,
SSR,
SSRHandler,
StartOptions,
} from "./types.ts";
export function fastro(startOptions?: StartOptions): Fastro {
const routes: Array<Route> = [];
const pages: Array<SSRHandler> = [];
const ac = new AbortController();
let staticFolder = "./public";
let staticPath = "/";
let server: Server;
const app = {
serve: (serveOptions: ServeInit) => {
const hostname = serveOptions?.hostname || "127.0.0.1";
const port = serveOptions?.port || 9000;
const baseUrl = `http://${hostname}:${port}`;
const baseStaticPath = `${baseUrl}${staticPath}`;
const cache = {};
for (const p of pages) {
const rootComponent = `App`;
const bundle = p.ssr._getBundleName();
const rootTSX = bundle;
p.ssr._createBundle(bundle, rootComponent, rootTSX);
}
const handler = createHandler(
routes,
baseStaticPath,
staticFolder,
cache,
pages,
);
if (startOptions && startOptions.flash) {
return Deno.serve({
hostname,
port,
handler,
onListen: serveOptions?.onListen,
onError: serveOptions?.onError,
signal: ac.signal,
});
}
server = new Server({
hostname,
port,
handler,
onError: serveOptions?.onError,
});
console.info(`Listening on http://${hostname}:${port}/`);
return server.listenAndServe();
},
static: (path: string, folder?: string) => {
staticPath = path;
if (folder) staticFolder = folder;
return app;
},
close: () => {
if (startOptions && startOptions.flash) {
return ac.abort();
}
return server.close();
},
get: (path: string, handler: HandlerArgument) => {
routes.push({ method: GET, path, handler });
return app;
},
post: (path: string, handler: HandlerArgument) => {
routes.push({ method: POST, path, handler });
return app;
},
put: (path: string, handler: HandlerArgument) => {
routes.push({ method: PUT, path, handler });
return app;
},
delete: (path: string, handler: HandlerArgument) => {
routes.push({ method: DELETE, path, handler });
return app;
},
patch: (path: string, handler: HandlerArgument) => {
routes.push({ method: PATCH, path, handler });
return app;
},
options: (path: string, handler: HandlerArgument) => {
routes.push({ method: OPTIONS, path, handler });
return app;
},
page: (
path: string,
ssr: SSR,
handler: HandlerArgument,
) => {
pages.push({ path, ssr, handler });
return app;
},
};
return app;
}