Changeset 7ccdced in Klonkt for src/services/ap-transport.js
- Timestamp:
- 10/26/2026 01:46:00 PM (25 hours ago)
- Branches:
- main
- Parents:
- bfa3ba3
- File:
-
- 1 edited
-
src/services/ap-transport.js (modified) (3 diffs)
Legend:
- Unmodified
- Added
- Removed
-
src/services/ap-transport.js
rbfa3ba3 r7ccdced 241 241 function deliveryStmts() { 242 242 if (!_insDeliv) { 243 _insDeliv = db.prepare('INSERT INTO ap_delivery (slug, inbox, host, body, attempts, next_at ) VALUES (?,?,?,?,0,CURRENT_TIMESTAMP)');243 _insDeliv = db.prepare('INSERT INTO ap_delivery (slug, inbox, host, body, attempts, next_at, tried) VALUES (?,?,?,?,0,CURRENT_TIMESTAMP,?)'); 244 244 // Alleen de OUDSTE openstaande rij per inbox: een nieuwere wacht op hem, ook 245 245 // als hij zelf al aan de beurt zou zijn. Op id, want dat is de volgorde … … 260 260 return { ins: _insDeliv, due: _dueDeliv, del: _delDeliv, bump: _bumpDeliv, host: _hostDeliv, off: _offDeliv, pendInbox: _pendInbox, hostWaits: _hostWaits }; 261 261 } 262 export function enqueueDelivery(slug, inbox, activity) { 262 // `tried`: ging er al een poging aan vooraf? Standaard ja, want zo riep iedereen 263 // dit aan: na een mislukte deliver(). Alleen wie in de rij zet zonder te 264 // proberen (deliverNowOrQueue bij een wachtende inbox of server) zegt nee. 265 export function enqueueDelivery(slug, inbox, activity, { tried = true } = {}) { 263 266 if (!slug || !inbox || !activity) return; 264 try { deliveryStmts().ins.run(slug, inbox, inboxHost(inbox), JSON.stringify(activity)); } catch { /* ignore */ } 267 try { deliveryStmts().ins.run(slug, inbox, inboxHost(inbox), JSON.stringify(activity), tried ? 1 : 0); } catch { /* ignore */ } 268 } 269 270 function objectIdOf(activity) { 271 const o = activity && activity.object; 272 return typeof o === 'string' ? o : (o && typeof o.id === 'string' ? o.id : null); 273 } 274 275 /** 276 * Een Delete van iets dat voor deze inbox nog in de rij staat (Robins vraag, 277 * 26-10: "shouldn't a Delete on an undelivered Create resolve internally?"). 278 * 279 * Ja: haal de wachtende Create en Update van dat object uit de rij. Dan komt 280 * wat gewist is nooit meer aan bij een server die het nog niet had -- de 281 * volgorde per inbox alleen zorgde er wel voor dat de Delete NA de Create 282 * kwam, maar de Create kwam dan nog steeds. 283 * 284 * Of de Delete daarna nog hoeft, hangt af van of er iets aangekomen KAN zijn: 285 * een rij die al eens geprobeerd is, kan dat (een time-out nadat de ander hem 286 * verwerkte). Dan gaat de Delete toch; die is onschuldig als ze hem niet 287 * kenden, en zonder hem blijft de post daar misschien staan. 288 */ 289 export function cancelUndelivered(inbox, objectId) { 290 if (!inbox || !objectId) return { cancelled: 0, mayHaveArrived: false }; 291 let cancelled = 0, mayHaveArrived = false; 292 try { 293 for (const r of db.prepare('SELECT id, body, attempts, tried FROM ap_delivery WHERE inbox = ?').all(inbox)) { 294 let a; try { a = JSON.parse(r.body); } catch { continue; } 295 if (!a || (a.type !== 'Create' && a.type !== 'Update') || objectIdOf(a) !== objectId) continue; 296 if (r.tried || r.attempts > 0) mayHaveArrived = true; 297 deliveryStmts().del.run(r.id); 298 cancelled++; 299 } 300 } catch { /* geen wachtrij te lezen: dan gewoon de Delete */ } 301 return { cancelled, mayHaveArrived }; 265 302 } 266 303 // Record delivery health per follower so the followers list can flag dead accounts. … … 289 326 // hoort (shaer-xzab.3). Drie plekken deden eerst zelf deliver() en pas bij een 290 327 // mislukking enqueueDelivery(), en gingen zo langs de volgorde per inbox. 328 // 329 // 'cancelled': een Delete van iets dat deze inbox nooit kreeg; er gaat niets 330 // heen (zie cancelUndelivered). 291 331 export async function deliverNowOrQueue(slug, inbox, activity, keyId, privPem) { 292 332 if (!inbox) return 'queued'; 333 if (activity && activity.type === 'Delete') { 334 const r = cancelUndelivered(inbox, objectIdOf(activity)); 335 if (r.cancelled && !r.mayHaveArrived) return 'cancelled'; 336 } 293 337 try { 294 338 const st = deliveryStmts(); 295 if (st.pendInbox.get(inbox) || st.hostWaits.get(inboxHost(inbox))) { enqueueDelivery(slug, inbox, activity ); return 'queued'; }339 if (st.pendInbox.get(inbox) || st.hostWaits.get(inboxHost(inbox))) { enqueueDelivery(slug, inbox, activity, { tried: false }); return 'queued'; } 296 340 } catch { /* geen wachtrij te lezen: gewoon proberen */ } 297 341 try { const st = await deliver(inbox, activity, keyId, privPem); if (st >= 200 && st < 300) { markFollowerDelivery(slug, inbox, true); return 'sent'; } } catch { /* queue below */ }
Note:
See TracChangeset
for help on using the changeset viewer.
![(please configure the [header_logo] section in trac.ini)](/chrome/site/your_project_logo.png)