diff options
| author | Adam Soltys <[email protected]> | 2023-01-17 11:53:24 -0800 |
|---|---|---|
| committer | Adam Soltys <[email protected]> | 2023-01-17 11:53:24 -0800 |
| commit | e918a818acf789a6619cbf4432f0c4713d4c53e6 (patch) | |
| tree | 0d30f8b6e519aaf31079f337e8808992f63f92ef /lib/nostr.js | |
| parent | 46913d34e77f19c3dd7c105b1deec452348dd1db (diff) | |
| download | coinos-server-e918a818acf789a6619cbf4432f0c4713d4c53e6.tar.gz coinos-server-e918a818acf789a6619cbf4432f0c4713d4c53e6.zip | |
nostr cleanup
Diffstat (limited to 'lib/nostr.js')
| -rw-r--r-- | lib/nostr.js | 332 |
1 files changed, 73 insertions, 259 deletions
diff --git a/lib/nostr.js b/lib/nostr.js index 93370587..d4dc2e67 100644 --- a/lib/nostr.js +++ b/lib/nostr.js @@ -7,16 +7,81 @@ import { g, s, db } from "$lib/db"; import { nada, wait } from "$lib/utils"; export let pool; -try { + +export let fillPool = () => { pool = RelayPool(config.relays); -} catch (e) { - console.log(e); -} + pool.on("open", relay => { + if (relay.url.includes(config.relay)) coinos = relay; + relay.subscribe("live", { limit: 1 }); + }); + + pool.on("event", async (relay, sub, ev) => { + if (timeouts[sub]) timeouts[sub].extend(ev); + try { + let content; + try { + content = JSON.parse(ev.content); + } catch (e) { + content = ev.content; + } + + if (sub === "live") { + let { pubkey } = ev; + + if (Math.abs(Math.floor(Date.now() / 1000) - ev.created_at) > 7200) + return; + + if (seen.includes(ev.id)) return; + seen.push(ev.id); + seen.length > 1000 && seen.shift(); + + if (coinos && ev.kind < 5) { + // coinos.send(["EVENT", ev]); + ev.user = await getUser(pubkey); + // broadcast("event", ev); + } + } else if (sub.includes("profile")) { + let { pubkey } = ev; + let user = await getUser(pubkey); + + if (user.updated > ev.created_at) return; -pool.on("open", relay => { - if (relay.url.includes(config.relay)) coinos = relay; - relay.subscribe("live", { limit: 1 }); -}); + if (content.name && user.username === pubkey.substr(0, 6)) + user.username = content.name; + + delete content.name; + + user = { + ...user, + ...content, + updated: ev.created_at + }; + + await s(`user:${pubkey}`, JSON.stringify(user)); + coinos.send(ev); + } else if (sub.includes("follows")) { + let pubkey = sub.split(":")[0]; + await s(`${pubkey}:follows`, JSON.stringify(ev.tags)); + for (let f of ev.tags) { + let [_, followPubkey] = f; + 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); + coinos.send(ev); + } else if (sub.includes("notes")) { + let pubkey = sub.split(":")[0]; + await db.sAdd(pubkey, ev.id); + await s(`ev:${ev.id}`, JSON.stringify(ev)); + } + } catch (e) { + console.log(e); + } + }); +}; export let coinos; let now = () => Math.round(Date.now() / 1000); @@ -97,254 +162,3 @@ let getUser = async pubkey => pubkey, anon: true }; - -pool.on("event", async (relay, sub, ev) => { - if (timeouts[sub]) timeouts[sub].extend(ev); - try { - let content; - try { - content = JSON.parse(ev.content); - } catch (e) { - content = ev.content; - } - - if (sub === "live") { - let { pubkey } = ev; - - if (Math.abs(Math.floor(Date.now() / 1000) - ev.created_at) > 7200) - return; - - if (seen.includes(ev.id)) return; - seen.push(ev.id); - seen.length > 1000 && seen.shift(); - - if (coinos && ev.kind < 5) { - // coinos.send(["EVENT", ev]); - ev.user = await getUser(pubkey); - // broadcast("event", ev); - } - } else if (sub.includes("profile")) { - let { pubkey } = ev; - let user = await getUser(pubkey); - - if (user.updated > ev.created_at) return; - - if (content.name && user.username === pubkey.substr(0, 6)) - user.username = content.name; - - delete content.name; - - user = { - ...user, - ...content, - updated: ev.created_at - }; - - await s(`user:${pubkey}`, JSON.stringify(user)); - coinos.send(ev); - } else if (sub.includes("follows")) { - let pubkey = sub.split(":")[0]; - await s(`${pubkey}:follows`, JSON.stringify(ev.tags)); - for (let f of ev.tags) { - let [_, followPubkey] = f; - 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); - coinos.send(ev); - } else if (sub.includes("notes")) { - let pubkey = sub.split(":")[0]; - await db.sAdd(pubkey, ev.id); - await s(`ev:${ev.id}`, JSON.stringify(ev)); - } - } catch (e) { - console.log(e); - } -}); - -export default { -async event (req, res) { - try { - let event = JSON.parse(await g(`ev:${req.params.id}`)); - let { pubkey } = event; - - event.user = JSON.parse(await g(`user:${pubkey}`)) || { - username: pubkey.substr(0, 6), - pubkey, - anon: true, - follows: [], - followers: [] - }; - - res.send(event); - } catch (e) { - res.code(500).send("Problem fetching event"); - } -}, - -async notes (req, res) { - try { - let { pubkey } = req.params; - - let user = JSON.parse(await g(`user:${pubkey}`)); - - if (!user) { - user = await db.User.findOne({ - where: { pubkey } - }); - } - - if (!user) - user = { - username: pubkey.substr(0, 6), - pubkey, - anon: true, - follows: [], - followers: [] - }; - - q( - `${pubkey}:notes`, - { - kinds: [1], - authors: [pubkey] - }, - { since: 0 } - ).catch(nada); - - await g(`user:${pubkey}`, JSON.stringify(user)); - - let ids = await db.sMembers(pubkey); - - let events = ids.length - ? (await db.mGet(ids.map(k => "ev:" + k))).map(JSON.parse) - : []; - - res.send(events.map(e => ({ ...e, user }))); - } catch (e) { - console.log(e); - res.code(500).send("problem fetching user events"); - } -}, - -async broadcast (req, res) { - let { event } = req.body; - pool.send(["EVENT", event]); - res.send(event); -}, - -async follows (req, res) { - try { - let { pubkey } = req.params; - let { tagsonly } = req.query; - - let sub = `${pubkey}:follows`; - q( - sub, - { - limit: 1, - kinds: [3], - authors: [pubkey] - }, - { timeout: 60000, eager: 60000 } - ).catch(nada); - - let tags = JSON.parse(await g(`${pubkey}:follows`)) || []; - if (tagsonly) return res.send(tags); - - let follows = []; - for (let f of tags) { - let [_, pubkey] = f; - - q(`${pubkey}:profile:f1`, { - limit: 1, - kinds: [0], - authors: [pubkey] - }).catch(nada); - - let user = JSON.parse(await g(`user:${pubkey}`)); - - if (!user) - user = { - username: pubkey.substr(0, 6), - pubkey, - anon: true - }; - - follows.push(user); - } - - follows = uniq(follows, e => e.pubkey); - follows.sort((a, b) => a.username.localeCompare(b.username)); - - res.send(follows); - } catch (e) { - console.log(e); - res.code(500).send(e && e.message); - } -}); - -async (req, res) followers { - try { - let { pubkey } = req.params; - - let pubkeys = [ - ...new Set([ - ...(await got(`${config.nostr}/followers?pubkey=${pubkey}`).json()), - ...(await db.sMembers(`${pubkey}:followers`)) - ]) - ]; - - let followers = []; - - q( - `${pubkey}:followers`, - { kinds: [3], "#p": [pubkey] }, - { timeout: 60000, eager: 60000 } - ).catch(nada); - - for (let pubkey of pubkeys) { - let user = JSON.parse(await g(`user:${pubkey}`)); - if (!user || !user.updated) { - q(`${pubkey}:profile:f2`, { - limit: 1, - kinds: [0], - authors: [pubkey] - }).catch(nada); - - user = JSON.parse(await g(`user:${pubkey}`)); - } - - if (!user) - user = { - username: pubkey.substr(0, 6), - pubkey, - anon: true - }; - - followers.push(user); - } - - followers = uniq(followers, e => e.pubkey); - followers.sort((a, b) => a.username.localeCompare(b.username)); - - res.send(followers); - } catch (e) { - console.log(e); - res.code(500).send(e && e.message); - } -}, - -async identities (req, res) { - res.send({ - names: { - adam: "566c166f3adab0c8fba5da015b0b3bcc8eb3696b455f2a1d43bfbd97059646a8", - asoltys: - "566c166f3adab0c8fba5da015b0b3bcc8eb3696b455f2a1d43bfbd97059646a8" - } - }); -} -} |
