aboutsummaryrefslogtreecommitdiffstats
path: root/lib/db.js
blob: f676946dca7481036d454f0f357079c4ff4e1daf (plain) (blame)
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
import config from "$config";
import { sleep } from "$lib/utils";
import { createClient } from "redis";
import { warn } from "$lib/logging";

export const db = createClient({ url: config.db });
await db.connect();
export default db;

export let g = async k => {
  let v = await db.get(k);
  try {
    return JSON.parse(v);
  } catch (e) {
    return v;
  }
};
export let s = (k, v) => {
  if (k === "user:null" || k === "user:undefined") {
    warn("###### NULL USER #######")
    console.trace();
  }
  db.set(k, JSON.stringify(v));
};

let retries = {};
export let t = async (k, f) => {
  try {
    await db.watch(k);
    await f(await db.get(k), db);
  } catch (err) {
    if (!err.message.includes("watch")) throw err;

    let r = retries[k] || 0;
    retries[k] = r + 1;

    if (r < 10) {
      await sleep(100);
      await t(k, f);
    } else {
      delete retries[k];
      throw new Error("unable to obtain lock");
    }
  }

  delete retries[k];
};