diff options
Diffstat (limited to 'ui/lib/session.svelte.js')
| -rw-r--r-- | ui/lib/session.svelte.js | 65 |
1 files changed, 65 insertions, 0 deletions
diff --git a/ui/lib/session.svelte.js b/ui/lib/session.svelte.js new file mode 100644 index 0000000..16c2a98 --- /dev/null +++ b/ui/lib/session.svelte.js @@ -0,0 +1,65 @@ +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); + } +} |
