- 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>
45 lines
2.3 KiB
Markdown
45 lines
2.3 KiB
Markdown
# 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 da `node: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_push` resta 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).
|