aboutsummaryrefslogtreecommitdiffstats
path: root/tools/topic-depth-test.js
diff options
context:
space:
mode:
authorAdam Soltys <[email protected]>2026-09-30 09:42:54 -0700
committerAdam Soltys <[email protected]>2026-09-30 09:42:54 -0700
commit93c07bec934e8e8d847349b7792f4cc9089adbb7 (patch)
tree098864eccfe77502ae76181aad9f095260bf3771 /tools/topic-depth-test.js
parente96c445e73d26e946cf2a3d515b5f0ab697ef5f0 (diff)
downloadcoinosv3-93c07bec934e8e8d847349b7792f4cc9089adbb7.tar.gz
coinosv3-93c07bec934e8e8d847349b7792f4cc9089adbb7.zip
Topic feeds go back as far as the relays remember, instead of "all caught up" after a handful.
#gardenstr: 5 posts across damus/primal/nos.lol/ours (they prune), 774 once archive-keeping relays are asked too (ditto, nostr.mom, oxtr, nostrplebs, nostr21, offchain) — topic feeds now read those. And a page whose posts were all filtered out (replies, muted, spam) no longer ends the feed: paging goes on from the oldest event the relays returned, up to three asks per scroll. The quoted-note wide net gains ditto/nostrplebs/nostr21. topic-depth-test (/feed/t/gardenstr): 9 posts then "caught up" before, 73+ and still going after. Co-Authored-By: Claude Opus 5.5 <[email protected]> Claude-Session: https://claude.ai/code/session_01Du1qT1wbkYwYK6zkGH79Rp
Diffstat (limited to 'tools/topic-depth-test.js')
-rw-r--r--tools/topic-depth-test.js36
1 files changed, 36 insertions, 0 deletions
diff --git a/tools/topic-depth-test.js b/tools/topic-depth-test.js
new file mode 100644
index 0000000..9876224
--- /dev/null
+++ b/tools/topic-depth-test.js
@@ -0,0 +1,36 @@
+// A topic feed (#gardenstr) goes back as far as the relays remember: the
+// big relays prune, so topics also ask archive-keeping ones, and a page
+// whose posts were all filtered out (replies, muted, spam) is not the end.
+// Before: ~5 posts, then "You're all caught up".
+//
+// Run: bun tools/topic-depth-test.js
+import puppeteer from 'puppeteer-core';
+import { buildHtml } from '../build.js';
+const sleep = (ms) => new Promise((r) => setTimeout(r, ms));
+let ok = true;
+const check = (n, c, d = '') => { console.log(` ${c ? '✓' : '✗'} ${n}${d ? ' — ' + d : ''}`); if (!c) ok = false; };
+const html = await buildHtml({ minify: true, pwa: false });
+const server = Bun.serve({ port: 5285, fetch: () => new Response(html, { headers: { 'content-type': 'text/html' } }) });
+const browser = await puppeteer.launch({ executablePath: '/usr/bin/google-chrome', headless: 'new', args: ['--no-sandbox'] });
+const page = await browser.newPage();
+try {
+ await page.setViewport({ width: 390, height: 844 });
+ await page.goto('http://localhost:5285/feed/t/gardenstr', { waitUntil: 'domcontentloaded' });
+ const count = () => page.evaluate(() => new Set([...document.querySelectorAll('.notes-feed [data-key]')].map((n) => n.getAttribute('data-key'))).size);
+ for (let i = 0; i < 60 && (await count()) < 3; i++) await sleep(500);
+ const first = await count();
+ check('the topic opens with posts', first >= 3, first + ' posts');
+ let seen = new Set(), ended = false;
+ const t0 = Date.now();
+ while (Date.now() - t0 < 90_000 && seen.size < 60) {
+ for (const k of await page.evaluate(() => [...document.querySelectorAll('.notes-feed [data-key]')].map((n) => n.getAttribute('data-key')))) seen.add(k);
+ ended = await page.evaluate(() => document.body.innerText.includes('all caught up'));
+ if (ended) break;
+ await page.evaluate(() => window.scrollTo(0, document.documentElement.scrollHeight));
+ await sleep(1500);
+ }
+ check('scrolling keeps finding older posts', seen.size >= 40, seen.size + ' posts' + (ended ? ', then "caught up"' : ''));
+ check('...without claiming to be caught up after a handful', !ended || seen.size >= 40);
+} finally { await browser.close(); server.stop(true); }
+console.log(ok ? '\n✅ a topic goes back' : '\n❌ failed');
+process.exit(ok ? 0 : 1);