Signals: feeds made from your subscriptions, picked by Jev (#254)
A Signal is a name and keywords. A task beside DeadAir's asks TypeSafe's Jev, on the owner's own key, about each item of their subscribed feeds from the last 30 days and every new one: one call an item, one noul question for each of their Signals still to hear about it, 0.5 or more a fit. Every verdict is kept, fitting or not, in signal_verdicts, so nothing is asked twice, and new keywords drop a Signal's verdicts to be judged afresh. A key TypeSafe refuses (401/402/403) is passed over until its owner saves another, so a bad key is not sent the whole queue. A Signal's items come through entries_where with an EXISTS on its hits, so filters, search, sort and read state are an ordinary list's, and reading an item in a Signal reads it in its feed. The page shows Signals under the places, with New signal, and Settings takes the TypeSafe key, which is never sent back. The browser suite stubs Jev in the fixture server (IPX_TYPESAFE_URL). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
@@ -143,3 +143,14 @@ test('a Patreon feed is told by its address', () => {
|
||||
assert.equal(run(`isPatreon({ url: 'https://example.com/feed' })`), false);
|
||||
assert.equal(run('isPatreon(null)'), false);
|
||||
});
|
||||
|
||||
test('a Signal is a place of its own, found by its id', () => {
|
||||
run(`S.signals = [{id: 7, name: 'F1', keywords: ['f1'], unread: 2}]`);
|
||||
assert.equal(run(`signalId(':signal:7')`), 7);
|
||||
assert.equal(run(`signalId(':all')`), null);
|
||||
assert.equal(run(`signalId('signal-7')`), null, 'a feed id is never a Signal');
|
||||
assert.equal(run(`signalOf(':signal:7').name`), 'F1');
|
||||
assert.equal(run(`signalOf(':signal:8')`), undefined);
|
||||
assert.match(run(`listUrl(':signal:7')`), /^\/api\/signals\/7\/entries\?/);
|
||||
run(`S.signals = []`);
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user