aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--.gitignore4
-rw-r--r--lib/app.ts23
-rw-r--r--lib/nostr.ts107
-rw-r--r--routes/users.ts2
4 files changed, 76 insertions, 60 deletions
diff --git a/.gitignore b/.gitignore
index ec037f4c..d80c06ae 100644
--- a/.gitignore
+++ b/.gitignore
@@ -12,4 +12,6 @@ watcher.sh
routes/**/*.js
lib/**/*.js
watcher.log
-.history/ \ No newline at end of file
+.history/
+res
+req
diff --git a/lib/app.ts b/lib/app.ts
index 9405b44b..5adc104c 100644
--- a/lib/app.ts
+++ b/lib/app.ts
@@ -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, "");