|
1 | 1 | import Elysia from 'elysia'; |
2 | | -import * as postgres from './postgres'; |
3 | | -import { Fortune, World } from './types'; |
| 2 | +import * as db from './postgres'; |
| 3 | +import { Fortune } from './types'; |
4 | 4 |
|
5 | | -const deps = new Elysia({ |
6 | | - name: 'deps', |
7 | | -}) |
8 | | - .decorate('db', postgres) |
9 | | - .decorate('generateRandomNumber', () => Math.ceil(Math.random() * 10000)) |
10 | | - .decorate('html', (fortunes: Fortune[]) => { |
11 | | - const n = fortunes.length; |
12 | | - |
13 | | - let html = ''; |
14 | | - for (let i = 0; i < n; i++) { |
15 | | - html += `<tr><td>${fortunes[i].id}</td><td>${Bun.escapeHTML( |
16 | | - fortunes[i].message |
17 | | - )}</td></tr>`; |
18 | | - } |
| 5 | +function rand () { |
| 6 | + return Math.ceil(Math.random() * 10000) |
| 7 | +} |
19 | 8 |
|
20 | | - return `<!DOCTYPE html><html><head><title>Fortunes</title></head><body><table><tr><th>id</th><th>message</th></tr>${html}</table></body></html>`; |
21 | | - }); |
| 9 | +function parseQueriesNumber (q?: string) { |
| 10 | + return Math.min(parseInt(q || '1') || 1, 500) |
| 11 | +} |
| 12 | + |
| 13 | +function renderTemplate (fortunes: Fortune[]) { |
| 14 | + const n = fortunes.length; |
| 15 | + |
| 16 | + let html = ''; |
| 17 | + for (let i = 0; i < n; i++) { |
| 18 | + html += `<tr><td>${fortunes[i].id}</td><td>${Bun.escapeHTML( |
| 19 | + fortunes[i].message |
| 20 | + )}</td></tr>`; |
| 21 | + } |
| 22 | + |
| 23 | + return `<!DOCTYPE html><html><head><title>Fortunes</title></head><body><table><tr><th>id</th><th>message</th></tr>${html}</table></body></html>`; |
| 24 | +} |
22 | 25 |
|
23 | 26 | const dbHandlers = new Elysia({ |
24 | 27 | name: 'db-handlers', |
25 | 28 | }) |
26 | | - .use(deps) |
27 | | - .get( |
28 | | - '/db', |
29 | | - async ({ db, generateRandomNumber }) => |
30 | | - await db.find(generateRandomNumber()) |
31 | | - ) |
32 | | - .get( |
33 | | - '/fortunes', |
34 | | - async ({ db, html }) => { |
35 | | - const fortunes = await db.fortunes(); |
36 | | - |
37 | | - fortunes.push({ |
38 | | - id: 0, |
39 | | - message: 'Additional fortune added at request time.', |
40 | | - }); |
41 | | - |
42 | | - fortunes.sort((a, b) => (a.message < b.message ? -1 : 1)); |
43 | | - |
44 | | - return html(fortunes); |
45 | | - }, |
46 | | - { |
47 | | - afterHandle({ set }) { |
48 | | - set.headers['content-type'] = 'text/html; charset=utf-8'; |
49 | | - }, |
50 | | - } |
51 | | - ) |
52 | | - .derive(({ query }) => ({ |
53 | | - numberOfObjects: Math.min(parseInt(query.queries || '1') || 1, 500), |
54 | | - })) |
55 | | - .get('/queries', async ({ db, generateRandomNumber, numberOfObjects }) => { |
56 | | - const worldPromises = new Array<Promise<World>>(numberOfObjects); |
57 | | - |
58 | | - for (let i = 0; i < numberOfObjects; i++) { |
59 | | - worldPromises[i] = db.find(generateRandomNumber()); |
60 | | - } |
| 29 | + .onAfterHandle(({ set }) => { |
| 30 | + set.headers['server'] = 'Elysia'; |
| 31 | + }) |
61 | 32 |
|
62 | | - const worlds = await Promise.all(worldPromises); |
| 33 | + .get('/db', () => db.find(rand())) |
63 | 34 |
|
64 | | - return worlds; |
| 35 | + .get('/fortunes', async ({ set }) => { |
| 36 | + const fortunes = await db.fortunes(); |
| 37 | + |
| 38 | + fortunes.push({ |
| 39 | + id: 0, |
| 40 | + message: 'Additional fortune added at request time.', |
| 41 | + }); |
| 42 | + |
| 43 | + fortunes.sort((a, b) => (a.message < b.message ? -1 : 1)); |
| 44 | + |
| 45 | + set.headers['content-type'] = 'text/html; charset=utf-8'; |
| 46 | + return renderTemplate(fortunes); |
| 47 | + }) |
| 48 | + |
| 49 | + .get('/queries', async ({ query }) => { |
| 50 | + const num = parseQueriesNumber(query.queries) |
| 51 | + const worldPromises = new Array(num); |
| 52 | + |
| 53 | + for (let i = 0; i < num; i++) { |
| 54 | + worldPromises[i] = db.find(rand()); |
| 55 | + } |
| 56 | + |
| 57 | + return await Promise.all(worldPromises); |
65 | 58 | }) |
66 | | - .get('/updates', async ({ db, generateRandomNumber, numberOfObjects }) => { |
67 | | - const worldPromises = new Array<Promise<World>>(numberOfObjects); |
68 | 59 |
|
69 | | - for (let i = 0; i < numberOfObjects; i++) { |
70 | | - worldPromises[i] = db.find(generateRandomNumber()); |
| 60 | + .get('/updates', async ({ query }) => { |
| 61 | + const num = parseQueriesNumber(query.queries) |
| 62 | + const worldPromises = new Array(num); |
| 63 | + |
| 64 | + for (let i = 0; i < num; i++) { |
| 65 | + worldPromises[i] = db.find(rand()); |
71 | 66 | } |
72 | 67 |
|
73 | 68 | const worlds = await Promise.all(worldPromises); |
74 | 69 |
|
75 | | - for (let i = 0; i < numberOfObjects; i++) { |
76 | | - worlds[i].randomNumber = generateRandomNumber(); |
| 70 | + for (let i = 0; i < num; i++) { |
| 71 | + worlds[i].randomNumber = rand(); |
77 | 72 | } |
78 | 73 |
|
79 | 74 | await db.bulkUpdate(worlds); |
80 | | - |
81 | 75 | return worlds; |
82 | 76 | }); |
83 | 77 |
|
|
0 commit comments