blob: 1122038c5b35dccc1675ca5d25a925fee40f1e87 (
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
|
import { sleep } from "$lib/utils";
import { createClient } from "redis";
export const db = createClient({ url: "redis://db" });
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) => {
let result;
try {
result = await db.executeIsolated(async db => {
await db.watch(k);
let v = await db.get(k);
await db
.multi()
.set(k, await f(v))
.exec();
});
} 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];
return result;
};
|