-
Notifications
You must be signed in to change notification settings - Fork 0
/
serve.ts
53 lines (41 loc) · 1.57 KB
/
serve.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
import { STATUS_CODE } from 'https://deno.land/std/http/status.ts'
import { fetchAllEntries } from './fetch.ts'
import { parseEntries } from './parse.ts'
import { generateFeed } from './generate.ts'
import { loadEntriesFromCache, saveEntriesToCache } from './cache.ts'
export const NOT_FOUND_RESPONSE = new Response(null, {
status: STATUS_CODE.NotFound,
})
export async function _serveDynamicFeed(request: Request) {
let entries = await loadEntriesFromCache()
if (entries.length === 0) {
const { newsEntries, podcastEntries } = await fetchAllEntries()
entries = parseEntries(newsEntries, podcastEntries)
saveEntriesToCache(entries)
}
const feed = generateFeed(entries)
return generateResponse(feed, request, 'application/rss+xml; charset=utf-8')
}
export async function serveStaticFeed(request: Request) {
const FEED = await Deno.readFile('./feed.rss')
return generateResponse(FEED, request, 'application/rss+xml; charset=utf-8')
}
export async function serveLanding(request: Request) {
const LANDING_PAGE = await Deno.readFile('./index.html')
return generateResponse(LANDING_PAGE, request, 'text/html; charset=utf-8')
}
export const serve404 = () => NOT_FOUND_RESPONSE
function generateResponse(
payload: BodyInit,
request: Request,
contentType: string,
) {
if (!['GET', 'HEAD'].includes(request.method)) return NOT_FOUND_RESPONSE
const body = request.method === 'HEAD' ? null : payload
const headers = {
'Accept-Ranges': 'bytes',
'Content-Type': contentType,
}
const status = STATUS_CODE.OK
return new Response(body, { headers, status })
}