Skip to content

Commit 1425239

Browse files
committed
merge: dev3 → master — cloud-realtime forza setAuth(user-JWT) prima delle subscribe + tappa 7 validata su andris
2 parents e22dd2f + cf8cdf9 commit 1425239

2 files changed

Lines changed: 18 additions & 1 deletion

File tree

cli/src/lib/cloud-realtime.js

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,14 @@ export async function createRealtimeSync({ config, log = () => {} } = {}) {
8787
}
8888
await persistRefreshToken(data.session.refresh_token);
8989

90+
// CRUCIALE per postgres_changes con RLS: il socket Realtime DEVE usare lo
91+
// user-JWT (non l'anon key) PRIMA di qualsiasi subscribe, altrimenti la RLS
92+
// valuta come anon e blocca SILENZIOSAMENTE la consegna (canale SUBSCRIBED ma
93+
// zero eventi). L'auto-wiring di supabase-js è asincrono e può arrivare dopo la
94+
// subscribe → lo forziamo qui.
95+
try { await client.realtime.setAuth(data.session.access_token); }
96+
catch (e) { log('warn', `setAuth iniziale: ${e.message}`); }
97+
9098
// Ad ogni rotazione del token (TOKEN_REFRESHED) → ripersisti + riallinea il
9199
// Realtime al nuovo access token.
92100
client.auth.onAuthStateChange((event, session) => {

docs/internal/2026-06-26-sync-status-report.md

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,16 @@ Tutte e 7 le tappe sono implementate su `dev3`, dietro il flag
3434
| 4 | desired-state → poll ~5min || `JHT_DESIRED_STATE_SEC` (default 300) nel loop lento |
3535
| 5 | heartbeat → poll ~3min || `JHT_HEARTBEAT_SEC` (default 180) — **sotto la soglia stale 5min** della dashboard (`team-state/claim/route.ts` `HEARTBEAT_STALE_MS`). Presence vera **DEFERRED** (richiede di cambiare come il web legge l'online) |
3636
| 6 | paracadute poll-lento || ogni ~5min (`JHT_PARACHUTE_SEC`) ri-legge sync + ticket → recupero se il socket muore. Gira anche se il setup Realtime fallisce (degrada a poll puro) |
37-
| 7 | test su andris dietro flag || **da fare da Leone**: accendere `JHT_REALTIME_SYNC=1` su andris, validare reattività + recupero a socket caduto |
37+
| 7 | test su andris dietro flag || **VALIDATO 2026-06-26**: `JHT_REALTIME_SYNC=1` su andris, canali `team_state`+`position_tickets` SUBSCRIBED, heartbeat 70s (online), "Sync now" end-to-end via websocket in **1,6s** (`sync_ok=true`). Vedi sotto |
38+
39+
### 🧪 Esito test live su andris (2026-06-26)
40+
- Immagine `:latest` (build 26/06 14:34) verificata contenere il codice; **mig 048 applicata a prod** (`position_tickets` in publication + replica full).
41+
- `JHT_REALTIME_SYNC=1` aggiunto al compose andris (oltre a `JHT_SUPABASE_DIRECT=1` già presente).
42+
- Canali `team-state` + `tickets` **SUBSCRIBED**, refresh_token valido (nessun errore auth).
43+
- **Sync now end-to-end: 1,6s** (trigger `sync_requested_at` → evento websocket → push → ack `sync_completed_at`).
44+
- 🐛 **BUG TROVATO E FIXATO live** (`90447acf4`): postgres_changes con RLS non consegnava nulla (canale SUBSCRIBED ma 0 eventi) perché il socket Realtime usava l'**anon key** invece dello **user-JWT** (l'auto-wiring del token in supabase-js è async e arrivava DOPO la subscribe). Fix: `client.realtime.setAuth(access_token)` forzato PRIMA delle subscribe.
45+
- ⚠️ **L'immagine NON ha ancora il fix setAuth** (committato dopo la build): andris gira col file **patchato a mano** (`docker cp`). Per renderlo permanente serve **merge dev3→master + rebuild :latest + redeploy**. Finché non si rifà l'immagine, NON fare `docker compose up -d` su andris (perderebbe la patch).
46+
- ⏳ Non ancora stress-testato: recupero a socket caduto (paracadute, validato per design) e dual-auth supabase-direct+realtime nel tempo (nessun errore finora).
3847

3948
**Nota sul lavoro parallelo:** la divisione in 3 (Part A/B/C) ha dato in pratica solo la
4049
**mig 048** (consegnata duplicata da due branch, non costruita sulla fondazione). Il

0 commit comments

Comments
 (0)