Encrypted, ephemeral, private memos on atproto
1import type { InputLocalKeyPair } from "@cistern/consumer";
2import { getLogger } from "@logtape/logtape";
3
4const KV_PATH = "./cistern-mcp.db";
5
6let kv: Deno.Kv | undefined;
7
8async function getKv(): Promise<Deno.Kv> {
9 if (!kv) {
10 kv = await Deno.openKv(KV_PATH);
11 }
12 return kv;
13}
14
15export async function getStoredKeypair(
16 handle: string,
17): Promise<InputLocalKeyPair | null> {
18 const logger = getLogger(["cistern", "mcp"]);
19 const db = await getKv();
20 const result = await db.get<InputLocalKeyPair>([
21 "cistern",
22 "keypairs",
23 handle,
24 ]);
25
26 if (result.value) {
27 logger.debug("found stored keypair for {handle}", { handle });
28 return result.value;
29 }
30
31 logger.debug("no stored keypair found for {handle}", { handle });
32 return null;
33}
34
35export async function storeKeypair(
36 handle: string,
37 keypair: InputLocalKeyPair,
38): Promise<void> {
39 const logger = getLogger(["cistern", "mcp"]);
40 const db = await getKv();
41
42 await db.set(["cistern", "keypairs", handle], keypair);
43
44 logger.info("stored keypair for {handle}", { handle });
45}