diff options
| author | Adam Soltys <[email protected]> | 2024-10-13 07:54:14 -0700 |
|---|---|---|
| committer | Adam Soltys <[email protected]> | 2024-10-13 14:57:07 +0000 |
| commit | 89163fd9a9e79bfc4d2e6cfe72ad109419705276 (patch) | |
| tree | 7d0fc6570fc156db8e0a43dc749dad8d2489b905 | |
| parent | c530e75c7fe3a93d095a036c21a24415dba8801b (diff) | |
| download | coinos-server-89163fd9a9e79bfc4d2e6cfe72ad109419705276.tar.gz coinos-server-89163fd9a9e79bfc4d2e6cfe72ad109419705276.zip | |
request logging
| -rw-r--r-- | .gitignore | 4 | ||||
| -rw-r--r-- | lib/app.ts | 23 | ||||
| -rw-r--r-- | lib/nostr.ts | 107 | ||||
| -rw-r--r-- | routes/users.ts | 2 |
4 files changed, 76 insertions, 60 deletions
@@ -12,4 +12,6 @@ watcher.sh routes/**/*.js lib/**/*.js watcher.log -.history/
\ No newline at end of file +.history/ +res +req @@ -7,19 +7,34 @@ import fastifySecureSession from "@fastify/secure-session"; import fastifyProxy from "@fastify/http-proxy"; import fastifyRateLimit from "@fastify/rate-limit"; import cors from "@fastify/cors"; +import pino from "pino"; import * as path from "path"; -import pino from "pino"; import { jwtStrategy } from "$lib/auth"; const app = fastify({ - logger: pino(), + logger: true, disableRequestLogging: true, - // disableRequestLogging: false, maxParamLength: 500, }); +const reqLogger = pino(pino.destination("req")); +const resLogger = pino(pino.destination("res")); + +app.addHook("onRequest", async (req) => { + reqLogger.info({ url: req.raw.url, id: req.id }); +}); + +app.addHook("onResponse", async (req, reply) => { + resLogger.info({ + id: req.id, + url: req.raw.url, + statusCode: reply.raw.statusCode, + durationMs: reply.elapsedTime, + }); +}); + app.register(fastifyRateLimit, { allowList: (req) => req.raw.url?.includes("public"), max: 100, @@ -38,7 +53,7 @@ app.register(fastifyProxy, { upstream: "http://localhost:3120", prefix: "/ws", rewritePrefix: "/ws", - websocket: true + websocket: true, }); app.register(fastifySecureSession, { diff --git a/lib/nostr.ts b/lib/nostr.ts index 1fcea5c3..2e1dcd71 100644 --- a/lib/nostr.ts +++ b/lib/nostr.ts @@ -17,6 +17,14 @@ let alwaysTrue: any = (t: Event) => { export let pool = new AbstractSimplePool({ verifyEvent: alwaysTrue }); let opts = { maxWait: 2000 }; +export let anon = (pubkey) => ({ + name: pubkey.substr(0, 6), + pubkey, + anon: true, + follows: [], + followers: [], +}); + export async function send(ev, url = config.nostr) { if (!(ev && ev.id)) return; let r = await Relay.connect(url); @@ -112,76 +120,64 @@ export let getRelays = async (pubkey): Promise<any> => { }; export let getProfile = async (pubkey) => { - let noprofile = await db.sIsMember("noprofile", pubkey); - if (noprofile) return; - let pubkeys = [pubkey]; - let relays = [config.nostr]; - let filter: any = { authors: pubkeys, kinds: [0] }; + let profile = await g(`${pubkey}:profile`); + if (!profile) { + let pubkeys = [pubkey]; + let relays = [config.nostr]; + let filter: any = { authors: pubkeys, kinds: [0] }; - let ev = await pool.get(relays, filter, opts); + let ev = await pool.get(relays, filter, opts); - if (!ev) { - filter = { cache: ["user_infos", { pubkeys }] }; - ev = (await pool.querySync([config.cache], filter, opts)).find( - (e) => e.kind === 0, - ); - } + if (!ev) { + filter = { cache: ["user_infos", { pubkeys }] }; + ev = (await pool.querySync([config.cache], filter, opts)).find( + (e) => e.kind === 0, + ); + } - if (!ev) { - ({ write: relays } = await getRelays(pubkey)); - ev = await pool.get(relays, filter, opts); + if (!ev) { + ({ write: relays } = await getRelays(pubkey)); + ev = await pool.get(relays, filter, opts); + } + + if (ev) { + send(ev); + profile = JSON.parse(ev.content); + } else { + profile = anon(pubkey); + } } - if (ev) { - send(ev); - return JSON.parse(ev.content); - } else return anon(pubkey); + await s(`${pubkey}:profile`, profile); + return profile; }; -export let anon = (pubkey) => ({ - name: pubkey.substr(0, 6), - pubkey, - anon: true, - follows: [], - followers: [], -}); - export let getCount = async (pubkey) => { - let created_at; - let filter: any = { kinds: [3], authors: [pubkey] }; - let ev = await pool.get([config.nostr], filter, opts); + let follows = await g(`${pubkey}:follows:n`); + let followers = await g(`${pubkey}:followers:n`); - if (!ev) { - let { relays } = config; - ({ write: relays } = await getRelays(pubkey)); + if (!follows) { + let filter: any = { kinds: [3], authors: [pubkey] }; + let ev = await pool.get([config.nostr], filter, opts); - filter = { kinds: [3], authors: [pubkey] }; - ev = await pool.get(relays, filter, opts); - send(ev); - } + if (!ev) { + let { relays } = config; + ({ write: relays } = await getRelays(pubkey)); - if (ev) ({ created_at } = ev); + filter = { kinds: [3], authors: [pubkey] }; + ev = await pool.get(relays, filter, opts); + send(ev); + } - let follows = 0; - let cache = await g(`${pubkey}:follows:n`); - if (cache && cache.t >= created_at) ({ follows } = cache); - else { - if (ev) + if (ev) { follows = ev.tags .map((t) => t[0] === "p" && t[1]) .filter((p) => p && p.length === 64).length; - await s(`${pubkey}:follows:n`, { follows, t: created_at }); + await s(`${pubkey}:follows:n`, follows); + } } - filter = { kinds: [3], "#p": [pubkey] }; - ev = await pool.get([config.nostr], filter, opts); - if (ev) ({ created_at } = ev); - - let followers = 0; - cache = await g(`${pubkey}:followers:n`); - - if (cache && cache.t >= created_at) ({ followers } = cache); - else { + if (!followers) { let filter: any = { cache: ["user_infos", { pubkeys: [pubkey] }] }; let infos = await pool.querySync([config.cache], filter, opts); @@ -190,9 +186,12 @@ export let getCount = async (pubkey) => { if (f && f.content) { counts = JSON.parse(f.content); followers = counts[pubkey]; - await s(`${pubkey}:followers:n`, { followers, t: created_at }); + await s(`${pubkey}:followers:n`, followers); } } + follows ||= 0; + followers ||= 0; + return { follows, followers }; }; diff --git a/routes/users.ts b/routes/users.ts index 81c6ae10..5f6f0747 100644 --- a/routes/users.ts +++ b/routes/users.ts @@ -299,7 +299,7 @@ export default { try { let { username, password, token: twofa } = req.body; - if (username !== "coinos" && username !== "funk") + if (username !== "coinos") l("logging in", username, req.headers["cf-connecting-ip"]); username = username.toLowerCase().replace(/\s/g, ""); |
