- Spezza il registro delle decisioni in docs/decisions/DD-XXX.md, con indice - Ripulisce DATABASE.md dalla storia delle migration e aggiunge la sezione Lettura - Riduce PROJECT_STATE.md a una pagina; la procedura di allestimento passa in OPERATIONS.md - Aggiunge OPERATIONS.md, GLOSSARIO.md, trappole note e checklist in ARCHITECTURE.md - Sintetizza la copertura test di badge.md e documenta docs/archive - Allinea AGENTS.md, README.md e la regola Cursor (tolto l'obbligo di develop, in contrasto con DD-019) Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2.3 KiB
DD-026 — Il testo della notifica viaggia dentro la push
Stato: accettata · Data: settembre 2026
Contesto
Le push partivano senza payload: il service worker, appena svegliato, chiedeva a
/api/public/push-messaggio che cosa mostrare. Ad app aperta funzionava; ad app chiusa e
telefono bloccato non arrivava niente. È lo scenario per cui il browser dà al worker pochi
secondi di vita: una fetch verso un endpoint che interroga Supabase è esattamente ciò che non
riesce a chiudersi in tempo, e senza showNotification non compare nulla. Urgency: high e
un timeout di 3 secondi sul recupero del testo avevano attenuato il sintomo, non la causa.
Decisione
Titolo e testo viaggiano cifrati nel corpo della push (aes128gcm, RFC 8188/8291) con le
chiavi p256dh e auth già salvate in push_subscriptions. Il service worker legge
event.data.json() e mostra la notifica: zero rete, zero attesa.
Cadono di conseguenza la route push-messaggio, la coda promemoria_push (con la sua
scadenza a 12 ore), messaggioPalloniOggi() e il timeout nel service worker: tutti pezzi che
esistevano solo per rimediare al payload vuoto. Tutti e tre i mittenti
(apri-sondaggio, sollecita-presenze, promemoria-palloni) avevano già il testo pronto
prima di inviare.
Alternative scartate
- Usare la libreria
web-push→ dipende danode:crypto, e il build nitro ha come target Cloudflare. La cifratura sta in ~40 righe di Web Crypto, già disponibile ovunque. - Allungare ancora il timeout della fetch → allunga anche il tempo in cui il worker può morire prima di mostrare qualcosa. Il problema era la fetch, non la sua durata.
Conseguenze
- La notifica non dipende più dalla rete al momento del risveglio, e nemmeno da una funzione serverless che risponda in fretta a freddo.
- Sparisce l'unico punto in cui chiunque conoscesse un endpoint push poteva leggere il messaggio destinato a quel dispositivo.
- Il payload sta sotto i 4 KB: i testi attuali sono ampiamente dentro, ma un messaggio molto lungo andrebbe accorciato.
- La tabella
promemoria_pushresta nel database, ora inutilizzata: va rimossa con una migrazione quando si tocca lo schema.
Riesame
Se servisse mandare payload più grandi del limite del protocollo, o se un servizio push
smettesse di accettare corpi cifrati (nessuno lo fa: è lo standard).