MIRROR: javascript for 馃悳's, a tiny runtime with big ambitions
1import meow from './meow.txt';
2import { join } from 'ant:path';
3import { html } from './html';
4import { readFile } from 'ant:fs';
5import { createRouter, addRoute, findRoute } from '../rou3';
6
7const router = createRouter();
8
9addRoute(router, 'GET', '/', () => {
10 return new Response(`Welcome to Ant ${Ant.version}!`);
11});
12
13addRoute(router, 'GET', '/meow', req => {
14 const userAgent = req.headers.get('User-Agent');
15 return new Response(`${meow}\n\n${userAgent}`, {
16 headers: { 'X-Ant': 'meow' }
17 });
18});
19
20addRoute(router, 'GET', '/echo', async () => {
21 const res = await fetch('http://localhost:8000/meow');
22 return new Response(await res.text(), {
23 headers: { 'X-Ant': 'meow' }
24 });
25});
26
27addRoute(router, 'GET', '/fs/meow', async () => {
28 const file = await readFile(join(import.meta.dirname, 'meow.txt'));
29 return new Response(file || 'none');
30});
31
32addRoute(router, 'GET', '/hello', () => {
33 return new Response('Hello, World!');
34});
35
36addRoute(router, 'GET', '/status', async () => {
37 await new Promise(resolve => setTimeout(resolve, 1000));
38 const result = await Promise.resolve('Hello');
39 return new Response(`server is responding with ${result}`);
40});
41
42addRoute(router, 'POST', '/users/:id', (_req, params) => {
43 return new Response(`User ID: ${params.id}`);
44});
45
46addRoute(router, 'GET', '/users/:id/posts', (_req, params) => {
47 return new Response(`Posts for user: ${params.id}`);
48});
49
50addRoute(router, 'GET', '/api/v1/users', () => {
51 return Response.json({ users: [] });
52});
53
54addRoute(router, 'GET', '/zen', async () => {
55 const response = await fetch('https://api.github.com/zen');
56 return new Response(await response.text());
57});
58
59addRoute(router, 'GET', '/api/v2/demo', async () => {
60 const data = await fetch('https://themackabu.dev/test.json');
61 return Response.json(await data.json());
62});
63
64addRoute(router, 'GET', '/files/**:path', (_req, params) => {
65 return new Response(html`<div>${params.path}</div>`, {
66 headers: { 'Content-Type': 'text/html' }
67 });
68});
69
70console.log('started on http://localhost:8000');
71
72export default {
73 port: 8000,
74 fetch(req) {
75 const url = new URL(req.url);
76
77 console.log('request:', req.method, url.pathname);
78 const result = findRoute(router, req.method, url.pathname);
79
80 if (result?.data) return result.data(req, result.params);
81 return new Response('not found: ' + url.pathname, { status: 404 });
82 }
83};