aboutsummaryrefslogtreecommitdiffstats
path: root/lib/db.js
diff options
context:
space:
mode:
Diffstat (limited to 'lib/db.js')
-rw-r--r--lib/db.js39
1 files changed, 35 insertions, 4 deletions
diff --git a/lib/db.js b/lib/db.js
index fb99a756..1122038c 100644
--- a/lib/db.js
+++ b/lib/db.js
@@ -1,9 +1,40 @@
-import { Redis } from "ioredis";
-import Redlock from "redlock";
+import { sleep } from "$lib/utils";
+import { createClient } from "redis";
-export const db = new Redis("redis://db", { enableAutoPipelining: true });
+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));
-export let t = (f) => new Redlock([db]).using([db], 5000, f);
+
+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;
+};