-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathserver.ts
More file actions
34 lines (30 loc) · 924 Bytes
/
server.ts
File metadata and controls
34 lines (30 loc) · 924 Bytes
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
import { baseURL, refetchProbability, port } from 'yourConfig.tsFilePath'
interface CachedResponse {
body: string
contentType: string
cacheControl: string
}
const cache: Record<string, CachedResponse> = {}
const fetchOrigin = async (path: string) => {
const res = await fetch(baseURL + path)
const data = {
body: await res.text(),
contentType: res.headers.get('content-type') ?? '',
cacheControl: res.headers.get('cache-control') ?? ''
}
if (res.ok) cache[path] = data
return data
}
Deno.serve({ port }, async (req) => {
const path = new URL(req.url).pathname
let data = cache[path]
if (!data) {
data = await fetchOrigin(path)
} else if (Math.random() < refetchProbability) {
fetchOrigin(path) // asynchronously update cache (took me 1hr to find this way 🥹 #EDiTH)
}
return new Response(data.body, { headers: {
'content-type': data.contentType,
'cache-control': data.cacheControl
} })
})