Link bookmarking tool built on aproto (early alpha)
1import {
2 NodeSavedSession,
3 NodeSavedSessionStore,
4 NodeSavedState,
5 NodeSavedStateStore,
6} from "@bigmoves/atproto-oauth-client"
7import { AUTH_PREFIX, kv } from "./kv"
8
9// ==== Utils ====
10
11export function stateKey(key: string | string[]): Deno.KvKey {
12 if (Array.isArray(key)) {
13 return [AUTH_PREFIX, "state", ...key]
14 }
15 return [AUTH_PREFIX, "state", key]
16}
17
18export function sessionKey(key: string | string[]): Deno.KvKey {
19 if (Array.isArray(key)) {
20 return [AUTH_PREFIX, "session", ...key]
21 }
22 return [AUTH_PREFIX, "session", key]
23}
24
25// ==== Store implementations ====
26
27export const StateStore = {
28 async get(key): Promise<NodeSavedState | undefined> {
29 const res = await kv.get<NodeSavedState>(stateKey(key))
30 return res.value ?? undefined
31 },
32 async set(key, val) {
33 await kv.set(stateKey(key), val)
34 },
35 async del(key: string) {
36 await kv.delete(stateKey(key))
37 },
38} satisfies NodeSavedStateStore
39
40export const SessionStore = {
41 async get(key): Promise<NodeSavedSession | undefined> {
42 const res = await kv.get<NodeSavedSession>(sessionKey(key))
43 return res.value ?? undefined
44 },
45 async set(key, val) {
46 await kv.set(sessionKey(key), val)
47 },
48 async del(key) {
49 await kv.delete(sessionKey(key))
50 },
51} satisfies NodeSavedSessionStore