aboutsummaryrefslogtreecommitdiffstats
path: root/lib/db.js
blob: c21e224f9cc364f187ac95b33775d5f88335ff97 (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
import { createClient } from "redis";

export const db = createClient({ url: "redis://db" });

db.on("error", err => console.log("db error", err));

await db.connect();

export default db;

export let g = async k => JSON.parse(await db.get(k));
export let s = (k, v) => db.set(k, JSON.stringify(v));

let retries = {};
export let t = async (k, f) => {
  retries[k] = retries[k] ? retries[k]++ : 0;
  await db.watch(k);
  let o = f(await g(k));
  let m = await db.multi();
  await s(k, o);

  if (retries[k] < 10) {
    if (!(await m.exec())) setTimeout(() => t(k, f), 100);
  } else throw new Error("could not obtain lock");
};