import { User, Users } from './users.svelte.js'; import { Conversations } from './conversations.svelte.js'; import { Messages } from './messages.svelte.js'; export class State { currentUser = $state(); users = $state(new Users()); conversations = $state(new Conversations()); messages = $state(new Messages()); static boot({ currentUser, heartbeat, resumePoint, events }) { const state = new State({ currentUser: User.boot(currentUser), heartbeat, resumePoint, }); for (const event of events) { state.onEvent(event); } return state; } constructor({ currentUser, heartbeat, resumePoint }) { this.currentUser = currentUser; this.heartbeat = heartbeat; this.resumePoint = resumePoint; } onEvent(event) { // Heartbeats are actually completely ignored here. They're handled in `Session`, but not as a // special case; _any_ event is a heartbeat event. switch (event.type) { case 'conversation': return this.onConversationEvent(event); case 'user': return this.onUserEvent(event); case 'message': return this.onMessageEvent(event); } } onConversationEvent(event) { switch (event.event) { case 'created': return this.onConversationCreated(event); case 'deleted': return this.onConversationDeleted(event); } } onConversationCreated(event) { const { id, name } = event; this.conversations.add({ id, name }); } onConversationDeleted(event) { const { id } = event; this.conversations.remove(id); } onUserEvent(event) { switch (event.event) { case 'created': return this.onUserCreated(event); } } onUserCreated(event) { const { id, name } = event; this.users.add({ id, name }); } onMessageEvent(event) { switch (event.event) { case 'sent': return this.onMessageSent(event); case 'deleted': return this.onMessageDeleted(event); } } onMessageSent(event) { const { id, at, conversation, sender, body } = event; this.messages.add({ id, at, conversation, sender, body }); } onMessageDeleted(event) { const { id } = event; this.messages.remove(id); } }