source: Klonkt/test/long-poll.test.js

main
Last change on this file was 2a17f0a, checked in by Robin <roboburr@…>, 6 weeks ago

Long-poll op nieuws: de thread blijft live zonder pull-to-refresh

Robins vraag (31-7): pull-to-refresh in een thread dwingt omhoog
scrollen; een knop is een pleister; long-poll is de echte vorm. GET
/ap/users/:slug/inbox/wait (owner-bearer) blijft hangen tot er iets
push-waardigs voor dat account landt (bericht, reply, wave,
hulp-request; dezelfde momenten als de webpush, want de wekker haakt in
pushEvent) en antwoordt dan 200; na ~25s stilte 204 en de app her-wapent.
In-process met opzet: een Klonkt is een proces, een waiter een callback.

Changed files:
src/services/ActivityPubService.js

  • onNews/wakeNews (waiter-registry); pushEvent wekt de waiters

src/routes/activitypub.js

  • /ap/users/:slug/inbox/wait: 200 bij nieuws, 204 na timeout, opgeruimd bij client-close

New file:
test/long-poll.test.js

  • elke waiter een keer gewekt, alleen het eigen account, afgemeld blijft stil

-robo
Co-Authored-By: Claude Opus 4.8 <noreply@…>

  • Property mode set to 100644
File size: 1.1 KB
Line 
1// Long-poll on news (Robins verzoek, 31-7): the thread in the app holds a
2// request open; anything push-worthy wakes every waiter exactly once, and an
3// unsubscribed waiter is never woken. The route wires this to 200/204.
4import { test } from 'node:test';
5import assert from 'node:assert/strict';
6
7process.env.DATABASE_PATH = ':memory:';
8process.env.PUBLIC_BASE_URL = 'https://test.example';
9
10const dbMod = await import('../src/config/database.js');
11dbMod.initializeDatabase();
12const AP = await import('../src/services/ActivityPubService.js');
13
14test('news wakes every waiter once, and only for that account', () => {
15 let a = 0, b = 0, other = 0;
16 AP.onNews('kid', () => a++);
17 AP.onNews('kid', () => b++);
18 AP.onNews('ander', () => other++);
19 AP.wakeNews('kid');
20 assert.equal(a, 1); assert.equal(b, 1);
21 assert.equal(other, 0, 'someone else\'s news is not yours');
22 AP.wakeNews('kid');
23 assert.equal(a, 1, 'a waiter fires once; the app re-arms with a new request');
24});
25
26test('an unsubscribed waiter stays silent', () => {
27 let fired = 0;
28 const off = AP.onNews('kid', () => fired++);
29 off();
30 AP.wakeNews('kid');
31 assert.equal(fired, 0);
32});
Note: See TracBrowser for help on using the repository browser.