summaryrefslogtreecommitdiff
path: root/ui/lib/session.svelte.js
diff options
context:
space:
mode:
Diffstat (limited to 'ui/lib/session.svelte.js')
-rw-r--r--ui/lib/session.svelte.js65
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);
+ }
+}