aboutsummaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
Diffstat (limited to 'lib')
-rw-r--r--lib/db.js39
-rw-r--r--lib/lightning.js62
-rw-r--r--lib/nostr.js6
-rw-r--r--lib/sendInternal.js93
-rw-r--r--lib/whitelist.js2
5 files changed, 41 insertions, 161 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;
+};
diff --git a/lib/lightning.js b/lib/lightning.js
index 57667be2..86dfdb2b 100644
--- a/lib/lightning.js
+++ b/lib/lightning.js
@@ -5,7 +5,6 @@ import { callWebhook } from "$lib/webhooks";
import ln from "$lib/ln";
import { l, err, warn } from "$lib/logging";
import { g, s, t, db } from "$lib/db";
-import Redlock from "redlock";
export async function listenForLightning() {
let {
@@ -18,6 +17,7 @@ export async function listenForLightning() {
} = await ln.waitanyinvoice(await g("pay_index"));
await s("pay_index", pay_index);
+ setTimeout(listenForLightning);
let received = Math.round(msatoshi_received / 1000);
@@ -52,65 +52,11 @@ export async function listenForLightning() {
invoice.status = "paid";
invoice.received += received;
- const redlock = new Redlock([db]);
-
await s(`invoice:${hash}`, invoice);
- console.log("BAL", await g(`balance:${uid}`));
- setTimeout(async () => {
- let lock = await redlock.acquire(["b"], 5000);
- try {
- let bal = await g(`balance:${uid}`);
- console.log("b bal", bal);
- await new Promise(r => setTimeout(r, 50));
-
- await s(`balance:${uid}`, bal + 100);
- console.log("set b bal", bal + 100);
- } finally {
- await lock.release();
- }
- // try {
- // console.log("tweaking balance");
- // await s(`balance:${uid}`, 0);
- // await new Promise(r => setTimeout(r, 5));
- // console.log("mwahaha", await g(`balance:${uid}`));
- // await new Promise(r => setTimeout(r, 600));
- // console.log("hmm", await g(`balance:${uid}`));
- // } catch (e) {
- // console.log(e);
- // }
- }, 50);
-
- await new Promise(r => setTimeout(r, 5));
-
- let lock = await redlock.acquire(["a"], 5000);
- try {
- let bal = await g(`balance:${uid}`);
- console.log("a bal", bal, received);
- await new Promise(r => setTimeout(r, 500));
-
- await s(`balance:${uid}`, bal + received);
- console.log("set a bal", bal + received);
- } finally {
- await lock.release();
- }
-
- // await t(async signal => {
- // console.log("acquiring lock");
- // let bal = await g(`balance:${uid}`);
- // console.log("bal", bal);
- // await new Promise(r => setTimeout(r, 500));
- //
- // if (signal.aborted) throw signal.error;
- //
- // await s(`balance:${uid}`, bal + received);
- // console.log("set bal", bal + received);
- // });
- console.log("done", await g(`balance:${uid}`));
-
+ await db.incrBy(`balance:${uid}`, received);
payment.invoice = invoice;
-
await s(`payment:${hash}`, payment);
- await db.lpush(`${uid}:payments`, hash);
+ await db.lPush(`${uid}:payments`, hash);
callWebhook(invoice, payment);
@@ -122,6 +68,4 @@ export async function listenForLightning() {
console.log(e);
err("problem receiving lightning payment", e.message);
}
-
- setTimeout(listenForLightning);
}
diff --git a/lib/nostr.js b/lib/nostr.js
index c8accf85..23ea937b 100644
--- a/lib/nostr.js
+++ b/lib/nostr.js
@@ -63,17 +63,17 @@ export let fillPool = () => {
await s(`${pubkey}:follows`, JSON.stringify(ev.tags));
for (let f of ev.tags) {
let [_, followPubkey] = f;
- await db.sadd(`${followPubkey}:followers`, pubkey);
+ await db.sAdd(`${followPubkey}:followers`, pubkey);
}
coinos.send(ev);
} else if (sub.includes("followers")) {
let followed = sub.split(":")[0];
let { pubkey } = ev;
- await db.sadd(`${followed}:followers`, pubkey);
+ await db.sAdd(`${followed}:followers`, pubkey);
coinos.send(ev);
} else if (sub.includes("notes")) {
let pubkey = sub.split(":")[0];
- await db.sadd(pubkey, ev.id);
+ await db.sAdd(pubkey, ev.id);
await s(`ev:${ev.id}`, JSON.stringify(ev));
}
} catch (e) {
diff --git a/lib/sendInternal.js b/lib/sendInternal.js
deleted file mode 100644
index 6054f753..00000000
--- a/lib/sendInternal.js
+++ /dev/null
@@ -1,93 +0,0 @@
-import config from "$config";
-import { emit } from "$lib/sockets";
-import store from "$lib/store";
-import { callWebhook } from "$lib/webhooks";
-import { v4 } from "uuid";
-import { notify } from "$lib/notifications";
-import { l, err } from "$lib/logging";
-import { fail } from "$lib/utils";
-import ln from "$lib/ln";
-import { g, s, db } from "$lib/db";
-
-const { HOSTNAME: hostname } = process.env;
-
-export default async ({ amount, hash, memo, tip }, user) => {
- amount = parseInt(amount);
-
- if (!amount || amount < 0) fail("Amount must be greater than zero");
-
- let fee = 0;
- let invoice = await g(`invoice:${hash}`);
-
- let t = async () => {
- await db.watch(`user:${user.id}`);
- user = await g(`user:${user.id}`);
- if (user.balance < amount) fail("Insufficient funds");
- user.balance -= amount;
- let m = await db.multi();
- await s(`user:${user.id}`, user);
-
- let p1 = {
- hash,
- amount: -amount,
- memo,
- uid: user.id,
- rate: store.rates[user.currency],
- currency: user.currency,
- type: "internal",
- created: Date.now()
- };
-
- await s(`payment:${hash}`, p1);
- await db.lpush(`${user.id}:payments`, hash);
-
- l("sent internal", user.username, -p1.amount);
- emit(user.id, "payment", p1);
-
- let { uid } = invoice;
- if (uid !== user.id) {
- let recipient = await g(`user:${uid}`);
-
- let u = async () => {
- await db.watch(`user:${uid}`);
- recipient = await g(`user:${uid}`);
- recipient.balance += amount;
- let m = await db.multi();
- await s(`user:${uid}`, recipient);
- if (!(await m.exec())) u();
- };
- await u();
-
- let p2 = {
- hash,
- amount,
- uid: recipient.id,
- rate: store.rates[recipient.currency],
- currency: recipient.currency,
- memo,
- type: "internal",
- with_id: user.id,
- created: Date.now()
- };
-
- let { tip } = invoice;
- if (tip) {
- p2.tip = tip;
- p2.amount -= tip;
- }
-
- invoice.received += amount;
- await s(`invoice:${hash}`, invoice);
- await s(`payment:${id}`, p2);
- await db.lpush(`${recipient.id}:payments`, id);
-
- l("received internal", recipient.username, amount);
- emit(recipient.username, "payment", p2);
- notify(recipient, `Received ${amount} sats`);
- callWebhook(invoice, p2);
- }
-
- if (!(await m.exec())) t();
- };
- await t();
-};
diff --git a/lib/whitelist.js b/lib/whitelist.js
index 49cc9af3..77243855 100644
--- a/lib/whitelist.js
+++ b/lib/whitelist.js
@@ -22,10 +22,8 @@ export default [
"pubkey",
"salt",
"seed",
- "symbol",
"theme",
"twofa",
- "unit",
"username",
"verified"
];