Watch party reader view: presented websites become clean text with per-device font size, landscape/portrait and an Original switch; SSRF-guarded server fetch

This commit is contained in:
Jonathan Sykes
2026-10-15 19:29:13 +08:00
parent 3f913de0c3
commit 1352ed9f29
8 changed files with 320 additions and 8 deletions

View File

@@ -168,7 +168,7 @@ export function createPartyHub({ now = () => Date.now(), profileExists = async (
else {
const url = String(v?.url || '').trim();
if (!/^https?:\/\/[^\s<>"]{3,2000}$/i.test(url)) return;
p.present = { url, page: Math.max(1, Math.min(9999, Math.floor(Number(v.page) || 1))), by: me.name, at: now() };
p.present = { url, mode: v.mode === 'reader' ? 'reader' : 'embed', page: Math.max(1, Math.min(9999, Math.floor(Number(v.page) || 1))), by: me.name, at: now() };
}
broadcast(p, { type: 'present', present: p.present });
} else if ((m.type === 'invite' || m.type === 'uninvite') && isHost) {
@@ -226,6 +226,7 @@ export function createPartyHub({ now = () => Date.now(), profileExists = async (
return {
upgrade,
invitesFor,
presentUrl: (code) => parties.get(code)?.present?.url || null,
websocket: { maxPayloadLength: MAX_MSG, idleTimeout: 120, open, message: (ws, msg) => message(ws, typeof msg === 'string' ? msg : null), close },
_parties: parties,
stop() { clearInterval(sweeper); },