From e3266ddecd825b8716df7dc418246441d4dcb0f7 Mon Sep 17 00:00:00 2001 From: Adam Soltys Date: Fri, 6 Jan 2023 17:31:22 -0800 Subject: background nostr fetching --- lib/nostr.js | 21 +++++++++++++-------- lib/sockets.js | 7 +++++-- lib/utils.js | 7 ++++++- lib/whitelist.js | 4 +++- 4 files changed, 27 insertions(+), 12 deletions(-) (limited to 'lib') diff --git a/lib/nostr.js b/lib/nostr.js index 4730883f..4ee5cb13 100644 --- a/lib/nostr.js +++ b/lib/nostr.js @@ -25,20 +25,24 @@ export let coinos; let now = () => Math.round(Date.now() / 1000); let timeouts = {}; -export let q = async (sub, query, timeout = 20000) => +export let q = async (sub, query, timeout = 20000, since = 3600, eager = 200) => new Promise(async (r, j) => { let start = Date.now(); let seen = []; let rejected; query.since = await redis.get(`since:${sub}`); - if (now() - query.since < 3600) return r(); + if (now() - query.since < since) return r(); let done = { [sub]: [] }; let check = s => { let elapsed = Date.now() - start; if (rejected) return true; - if (done[s].length === pool.relays.length || elapsed > 200) { + if ( + done[s] && + (done[s].length === pool.relays.length || + (done[s].length && elapsed > eager)) + ) { r(); if (timeouts[s]) timeouts[s].clear(); return true; @@ -78,7 +82,7 @@ export let q = async (sub, query, timeout = 20000) => }); try { - await wait(() => check(sub)); + await wait(() => check(sub), 100, 200); } catch (e) { console.log(e); } @@ -137,6 +141,7 @@ pool.on("event", async (relay, sub, ev) => { await redis.set(`user:${pubkey}`, JSON.stringify(user)); await redis.set(`user:${user.username}`, JSON.stringify(user)); + coinos.send(ev); } else if (sub.includes("follows")) { let pubkey = sub.split(":")[0]; await redis.set(`${pubkey}:follows`, JSON.stringify(ev.tags)); @@ -144,14 +149,14 @@ pool.on("event", async (relay, sub, ev) => { let [_, followPubkey] = f; await redis.sAdd(`${followPubkey}:followers`, pubkey); } + coinos.send(ev); } else if (sub.includes("followers")) { let followed = sub.split(":")[0]; let { pubkey } = ev; await redis.sAdd(`${followed}:followers`, pubkey); - } else { - if (!relay.url.includes("coinos")) return; - - let pubkey = sub; + coinos.send(ev); + } else if (sub.includes("notes")) { + let pubkey = sub.split(":")[0]; ev.user = await getUser(pubkey); if (!ev.user.updated) { diff --git a/lib/sockets.js b/lib/sockets.js index 3bd0c2c2..82cf3f51 100644 --- a/lib/sockets.js +++ b/lib/sockets.js @@ -85,6 +85,7 @@ app.register(async function(app) { break; case "login": + let user; let token = data; if (lastSeen[token] > subtractSeconds(5)) return; lastSeen[token] = new Date(); @@ -92,7 +93,9 @@ app.register(async function(app) { try { if (!token || token === "null" || !jwt.decode(token)) return ws.close(code, `bad token ${token}`); - const { username, uuid } = jwt.decode(token); + let { username, uuid } = jwt.decode(token); + if (uuid) user = await getUser(uuid); + username = user.username; if (!(username || uuid)) throw new Error("Invalid JWT token"); if (!store.sockets[username]) store.sockets[username] = {}; @@ -110,7 +113,7 @@ app.register(async function(app) { store.sockets[username][id] = ws; names[id] = username; - let user = await getUser(username); + if (!user) user = await getUser(username); let { haspin } = user; diff --git a/lib/utils.js b/lib/utils.js index 748b2a74..95ee5fb1 100644 --- a/lib/utils.js +++ b/lib/utils.js @@ -11,6 +11,8 @@ import ln from "$lib/ln"; const { Op } = sequelize; +export const nada = () => {}; + export const sleep = n => new Promise(r => setTimeout(r, n)); export const wait = async (f, s = 300, n = 50) => { let i = 0; @@ -33,7 +35,10 @@ export const getUser = async (username, transaction) => { } ], where: { - username: { [Op.or]: [username, username.replace(/ /g, "")] } + [Op.or]: { + username: { [Op.or]: [username, username.replace(/ /g, "")] }, + uuid: { [Op.or]: [username, username.replace(/ /g, "")] } + } } }; diff --git a/lib/whitelist.js b/lib/whitelist.js index 4e4dc14e..96db6cdc 100644 --- a/lib/whitelist.js +++ b/lib/whitelist.js @@ -8,6 +8,7 @@ export default [ "cipher", "currencies", "currency", + "display", "email", "fiat", "follows", @@ -18,8 +19,9 @@ export default [ "keys", "locktime", "payments", - "pubkey", "profile", + "prompt", + "pubkey", "salt", "seed", "symbol", -- cgit v1.2.3