/** * Svelte context bridge for the Nexo runtime: the `DatingAppHandle` * (App + API) plus a session cell owned by the shell layout. Nested * pages and components consume both via `getNexoContext()` instead of * each rebuilding their own. * * Symbol-keyed (instead of `setContext('app', ...)`) so it can't * collide with whatever else the surrounding SvelteKit app registers. * * `session` is exposed as a getter — pages call `nexo.session()` so * `$derived(...)` and `$effect(...)` track session-aware UI without * each page re-issuing its own `/api/session` probe. */ import { getContext, setContext } from 'svelte'; import type { DatingAppHandle } from './app.ts'; import type { DatingRealtimeHandle } from './realtime.ts'; import type { DatingSessionResponse } from './types.ts'; export interface NexoContext extends DatingAppHandle { /** Current session snapshot. `null` while the initial probe is in flight. */ session(): DatingSessionResponse | null; /** Replace the session cell after a login / logout / refresh. */ setSession(next: DatingSessionResponse | null): void; /** Re-issue `/api/session`; layout uses it on mount, pages on demand. */ refreshSession(): Promise; /** * Shared WebSocket subscription to `/api/realtime`. Pages call * `realtime().subscribe(...)` to react to server-pushed events * (new chat messages, match updates, …). The layout owns the * single underlying connection. */ realtime(): DatingRealtimeHandle; } const NEXO_CONTEXT_KEY = Symbol('nexo.context'); export function setNexoContext(value: NexoContext): NexoContext { return setContext(NEXO_CONTEXT_KEY, value); } export function getNexoContext(): NexoContext { const value = getContext(NEXO_CONTEXT_KEY); if (value === undefined) { throw new Error('Nexo context is not set. Did you mount /dating without its layout?'); } return value; } // Back-compat aliases — pages that only need the App handle keep the // terser names. New code uses `getNexoContext()` for the session // surface too. export const setNexoApp = setNexoContext; export const getNexoApp = getNexoContext;