A seat a link carries is kept only once the server takes it, and never over a seat this browser holds that still opens, so a link someone else sends cannot take a working seat away
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01MbtUPJ24P6vc6tE1x6RS3m
This commit is contained in:
co-authored by
Claude Opus 5.5
parent
ecab471122
commit
4721b0e97b
@@ -5,7 +5,7 @@
|
|||||||
import Lobby from '$lib/components/Lobby.svelte';
|
import Lobby from '$lib/components/Lobby.svelte';
|
||||||
import ReportSlip from '$lib/components/ReportSlip.svelte';
|
import ReportSlip from '$lib/components/ReportSlip.svelte';
|
||||||
import Preferences from '$lib/components/Preferences.svelte';
|
import Preferences from '$lib/components/Preferences.svelte';
|
||||||
import { rememberSeat, seatFor, seatInLink, trustSeat } from '$lib/net/client';
|
import { rememberSeat, seatFor, seatInLink, trustSeat, type HeldSeat } from '$lib/net/client';
|
||||||
import { NAME_MAX, playerName, rememberName, Room } from '$lib/net/room.svelte';
|
import { NAME_MAX, playerName, rememberName, Room } from '$lib/net/room.svelte';
|
||||||
|
|
||||||
const roomId = $derived((page.params.code ?? '').toUpperCase());
|
const roomId = $derived((page.params.code ?? '').toUpperCase());
|
||||||
@@ -25,23 +25,31 @@
|
|||||||
const link = $derived(`${location.origin}/join/${roomId}`);
|
const link = $derived(`${location.origin}/join/${roomId}`);
|
||||||
const watching = $derived(room?.spectating ?? false);
|
const watching = $derived(room?.spectating ?? false);
|
||||||
|
|
||||||
// Return to a held seat, or take a place in the gallery and offer one.
|
// Return to a held seat, or take a place in the gallery and offer one. A link from the keeper carries a seat:
|
||||||
|
// it leaves the address bar at once, is kept only once the server takes it, and never replaces a seat that
|
||||||
|
// still opens, so a link someone else sends cannot take a working seat away.
|
||||||
$effect(() => {
|
$effect(() => {
|
||||||
const id = roomId;
|
const id = roomId;
|
||||||
room = null;
|
room = null;
|
||||||
error = '';
|
error = '';
|
||||||
// A link from the keeper carries a seat; it is kept, and the token taken out of the address bar.
|
|
||||||
const sent = seatInLink(location.hash);
|
const sent = seatInLink(location.hash);
|
||||||
if (sent) {
|
if (sent) replaceState(location.pathname + location.search, {});
|
||||||
rememberSeat(id, sent);
|
|
||||||
trustSeat(id);
|
|
||||||
replaceState(location.pathname + location.search, {});
|
|
||||||
}
|
|
||||||
const held = seatFor(id);
|
const held = seatFor(id);
|
||||||
const arrive = held ? Room.resume(id, held) : Room.watch(id);
|
const take = (s: HeldSeat) =>
|
||||||
joining = !held;
|
Room.resume(id, s).then((r) => {
|
||||||
|
rememberSeat(id, s);
|
||||||
|
trustSeat(id);
|
||||||
|
return r;
|
||||||
|
});
|
||||||
|
const arrive = held ? Room.resume(id, held).catch((e: Error) => (sent ? take(sent) : Promise.reject(e))) : sent ? take(sent).catch(() => Room.watch(id)) : Room.watch(id);
|
||||||
|
joining = !held && !sent;
|
||||||
if (!held) name = playerName();
|
if (!held) name = playerName();
|
||||||
arrive.then((r) => (room = r)).catch((e: Error) => (error = e.message));
|
arrive
|
||||||
|
.then((r) => {
|
||||||
|
room = r;
|
||||||
|
if (r.spectating) joining = true;
|
||||||
|
})
|
||||||
|
.catch((e: Error) => (error = e.message));
|
||||||
});
|
});
|
||||||
|
|
||||||
// Keep the view fresh for as long as the room is on screen.
|
// Keep the view fresh for as long as the room is on screen.
|
||||||
|
|||||||
Reference in New Issue
Block a user