-
Notifications
You must be signed in to change notification settings - Fork 364
/
cache_.sqlite.tsx
56 lines (54 loc) · 1.71 KB
/
cache_.sqlite.tsx
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
import type { DataFunctionArgs } from '@remix-run/node'
import { json, redirect } from '@remix-run/node'
import { z } from 'zod'
import { getInstanceInfo, getInternalInstanceDomain } from 'litefs-js'
import { cache } from '~/utils/cache.server.ts'
export async function action({ request }: DataFunctionArgs) {
const { currentIsPrimary, primaryInstance } = await getInstanceInfo()
if (!currentIsPrimary) {
throw new Error(
`${request.url} should only be called on the primary instance (${primaryInstance})}`,
)
}
const token = process.env.INTERNAL_COMMAND_TOKEN
const isAuthorized =
request.headers.get('Authorization') === `Bearer ${token}`
if (!isAuthorized) {
// rick roll them
return redirect('https://www.youtube.com/watch?v=dQw4w9WgXcQ')
}
const { key, cacheValue } = z
.object({ key: z.string(), cacheValue: z.unknown().optional() })
.parse(await request.json())
if (cacheValue === undefined) {
await cache.delete(key)
} else {
// @ts-expect-error - we don't reliably know the type of cacheValue
await cache.set(key, cacheValue)
}
return json({ success: true })
}
export async function updatePrimaryCacheValue({
key,
cacheValue,
}: {
key: string
cacheValue: any
}) {
const { currentIsPrimary, primaryInstance } = await getInstanceInfo()
if (currentIsPrimary) {
throw new Error(
`updatePrimaryCacheValue should not be called on the primary instance (${primaryInstance})}`,
)
}
const domain = getInternalInstanceDomain(primaryInstance)
const token = process.env.INTERNAL_COMMAND_TOKEN
return fetch(`${domain}/admin/cache/sqlite`, {
method: 'POST',
headers: {
Authorization: `Bearer ${token}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({ key, cacheValue }),
})
}