diff options
Diffstat (limited to 'lib/db.js')
| -rw-r--r-- | lib/db.js | 142 |
1 files changed, 0 insertions, 142 deletions
diff --git a/lib/db.js b/lib/db.js deleted file mode 100644 index 4f113a1d..00000000 --- a/lib/db.js +++ /dev/null @@ -1,142 +0,0 @@ -import config from "$config"; -import { fail, wait, sleep } from "$lib/utils"; -import { createClient, defineScript } from "redis"; -import { warn, l, err } from "$lib/logging"; - -let SCRIPT = ` -local balanceKey = KEYS[1] -local creditKey = KEYS[2] -local amount = tonumber(ARGV[1]) -local tip = tonumber(ARGV[2]) -local fee = tonumber(ARGV[3]) -local ourfee = tonumber(ARGV[4]) - -local balance = tonumber(redis.call('get', balanceKey) or '0') -local credit = tonumber(redis.call('get', creditKey) or '0') - -local covered = math.min(credit, ourfee) -ourfee = ourfee - covered - -if balance < amount + tip + fee + ourfee then - return {err = 'Insufficient funds ⚡️' .. balance .. ' of ⚡️' .. amount + tip + fee + ourfee} -end - -redis.call('decrby', creditKey, tostring(math.floor(covered))) -redis.call('decrby', balanceKey, tostring(math.floor(amount + tip + fee + ourfee))) - -return ourfee -`; - -let debit = defineScript({ - NUMBER_OF_KEYS: 2, - SCRIPT, - transformArguments: (...args) => args.map((a) => a.toString()), -}); - -export let db = createClient({ - url: config.db, - scripts: { debit }, - socket: { - reconnectStrategy: (retries) => Math.min(retries * 50, 5000), - }, -}); - -export let archive = createClient({ - url: config.archive, - socket: { - reconnectStrategy: (retries) => Math.min(retries * 50, 5000), - }, -}); - -export let arc2 = createClient({ - url: config.arc2, - socket: { - reconnectStrategy: (retries) => Math.min(retries * 50, 5000), - }, -}); - -async function dbReconnect() { - try { - await db.connect(); - } catch (err) { - console.error("Failed to connect to Redis, retrying...", err); - setTimeout(dbReconnect, 5000); // Retry after 5 seconds - } -} - -async function archiveReconnect() { - try { - await archive.connect(); - } catch (err) { - console.error("Failed to connect to Redis, retrying...", err); - setTimeout(archiveReconnect, 5000); // Retry after 5 seconds - } -} - -dbReconnect(); -archiveReconnect(); - -db.on("error", (e) => { - if (e.message.startsWith("getaddr")) return; - err("Redis error", e.message); -}); - -db.on("end", () => { - warn("Redis connection ended"); -}); - -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") fail("null user"); - db.set(k, JSON.stringify(v)); -}; - -export let ga = async (k) => { - let v = await archive.get(k); - try { - return JSON.parse(v); - } catch (e) { - return v; - } -}; - -export let sa = (k, v) => { - if (k === "user:null" || k === "user:undefined") { - warn("###### NULL USER #######"); - console.trace(); - } - archive.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]; - fail("unable to obtain lock"); - } - } - - delete retries[k]; -}; |
