import { redirect } from '@sveltejs/kit'; import * as api from './apiServer.js'; import * as r from './state/remote/state.svelte.js'; import * as l from './state/local/channels.svelte.js'; class Session { remote = $state(); local = $state(); currentUser = $derived(this.remote.currentUser); logins = $derived(this.remote.logins.all); channels = $derived(this.remote.channels.all); messages = $derived( this.remote.messages.all.map((message) => message.resolve({ sender: (id) => this.logins.get(id) }) ) ); static boot({ login, logins, channels, messages, resume_point }) { const remote = r.State.boot({ currentUser: login, logins, channels, messages, resumePoint: resume_point }); const local = l.Channels.fromLocalStorage(); return new Session(remote, local); } constructor(remote, local) { this.remote = remote; this.local = local; } begin() { this.events = api.subscribeToEvents(this.remote.resumePoint); this.events.onmessage = this.onMessage.bind(this); } end() { this.events.close(); this.events = null; } onMessage(message) { const event = JSON.parse(message.data); this.remote.onEvent(event); this.local.retainChannels(this.remote.channels.all.keys()); } } export async function boot() { const response = await api.boot(); switch (response.status) { case 401: redirect(307, '/login'); break; case 503: redirect(307, '/setup'); break; case 200: return Session.boot(response.data); } }