feat: v6.5.0 Synced blocks production — pages contenu par lignes de DB, résolution serveur à chaque lecture, propagation écrite réelle
FlowDeck CI / lint (push) Successful in 1m27s
FlowDeck CI / test (push) Successful in 10m51s
FlowDeck CI / docker (push) Successful in 1m21s

This commit is contained in:
2026-09-24 08:28:25 -04:00
parent f2f2f3209e
commit 5951c707eb
16 changed files with 990 additions and 50 deletions
+16 -14
View File
@@ -207,7 +207,11 @@ class RealtimeManager:
room.title = row["title"] or ""
if (row["content_format"] or "") == "blocks" and row["content"]:
try:
room.blocks = ensure_block_ids(json.loads(row["content"]))
blocks = ensure_block_ids(json.loads(row["content"]))
# v6.5.0: rooms serve server-resolved synced blocks so a
# sync_req never returns a stale cached copy.
from app.services.synced_blocks import resolve_synced_block
room.blocks = resolve_synced_block(blocks)
except Exception:
room.blocks = []
return True
@@ -503,19 +507,8 @@ class RealtimeManager:
for r in self._rooms.values()],
}
async def _propagate_synced(self, synced_id: int) -> None:
"""Broadcast a synced-block update to all rooms that reference it."""
from app.db import get_conn as _get_conn
pages: list[int] = []
try:
with _get_conn() as conn:
rows = conn.execute(
"SELECT page_id FROM page_synced_blocks WHERE synced_block_id=?",
(synced_id,),
).fetchall()
pages = [r["page_id"] for r in rows]
except Exception:
return
async def _broadcast_synced_to(self, pages: list[int], synced_id: int) -> None:
"""Broadcast a synced-block event to the given pages' open rooms."""
for pid in pages:
room = self._rooms.get(pid)
if room and room.conns:
@@ -524,5 +517,14 @@ class RealtimeManager:
"synced_id": synced_id,
"version": room.version})
async def _propagate_synced(self, synced_id: int) -> None:
"""Broadcast a synced-block update to all rooms that reference it."""
from app.services.synced_blocks import page_ids_for_synced
try:
pages = page_ids_for_synced(synced_id)
except Exception:
return
await self._broadcast_synced_to(pages, synced_id)
manager = RealtimeManager()