From d6eae3f2d391406ed15a81a4714ad0de28611a4f Mon Sep 17 00:00:00 2001 From: Claas Date: Mon, 15 Dec 2025 22:51:40 +0100 Subject: [PATCH] Fix your own messages not appearing in chat --- app/src/broadcast.ts | 6 ++--- app/src/database/schema.d.ts | 15 ++++++++++-- app/src/service-worker/serviceWorker.ts | 31 ++++++++++++++++++------- 3 files changed, 39 insertions(+), 13 deletions(-) diff --git a/app/src/broadcast.ts b/app/src/broadcast.ts index 26198fe..f586927 100644 --- a/app/src/broadcast.ts +++ b/app/src/broadcast.ts @@ -1,5 +1,5 @@ import { onCleanup } from "solid-js"; -import { Group, IncomingMessage } from "./database/schema"; +import { Group, Message } from "./database/schema"; export const BROADCAST_NAME = "meal"; export const broadcast = new BroadcastChannel(BROADCAST_NAME); @@ -10,9 +10,9 @@ export type BroadcastMessage = group: Group; } | { - type: "Message received"; + type: "Message added"; groupId: string; - message: IncomingMessage; + message: Message; } | { type: "Wipe"; diff --git a/app/src/database/schema.d.ts b/app/src/database/schema.d.ts index bf072d8..99bb3c6 100644 --- a/app/src/database/schema.d.ts +++ b/app/src/database/schema.d.ts @@ -9,11 +9,22 @@ export type User = { */ name?: string; }; + export type IncomingMessage = { - sentAt: Date; + type: "incoming"; receivedAt: Date; + sentAt: Date; text: string; }; + +export type OutgoingMessage = { + type: "outgoing"; + sentAt: Date; + text: string; +}; + +export type Message = IncomingMessage | OutgoingMessage; + export type Group = { id: string; /** @@ -21,7 +32,7 @@ export type Group = { */ user?: User; friend: Friend; - messages: IncomingMessage[]; + messages: Message[]; }; interface Schema extends DBSchema { diff --git a/app/src/service-worker/serviceWorker.ts b/app/src/service-worker/serviceWorker.ts index 3044108..b158194 100644 --- a/app/src/service-worker/serviceWorker.ts +++ b/app/src/service-worker/serviceWorker.ts @@ -1,7 +1,7 @@ import { precacheAndRoute } from "workbox-precaching"; import init, { Client, DecodedPackage, Friend } from "meal-core"; import { expose } from "../crackle"; -import { Group, IncomingMessage } from "../database/schema"; +import { Group, IncomingMessage, OutgoingMessage } from "../database/schema"; import { broadcastMessage } from "../broadcast"; import { deleteDatabase, @@ -137,7 +137,7 @@ function assertNotShared( throw new Error("Uint8Array uses a SharedArrayBuffer"); } -export type OutgoingMessage = { +type SendMessageRequest = { groupId: string; sentAt: Date; text: string; @@ -228,18 +228,32 @@ const handler = { throw new Error(`Unexpected status code response ${response.status}`); }, - async sendMessage(message: OutgoingMessage) { - const group = await getGroup(message.groupId); + async sendMessage(request: SendMessageRequest) { + const group = await getGroup(request.groupId); if (group === undefined) throw new Error("Group not found"); + const message: OutgoingMessage = { + type: "outgoing", + sentAt: request.sentAt, + text: request.text, + }; + group.messages.push(message); + + //TODO update group in transaction to avoid race conditions + const groupUpdate = updateGroup(group); + broadcastMessage({ + type: "Message added", + groupId: group.id, + message, + }); const client = await getClient; const body = client.send_message(group.id, { - sent_at: message.sentAt.toISOString(), - text: message.text, + sent_at: request.sentAt.toISOString(), + text: request.text, }); assertNotShared(body); - await postMessage(group.friend.id, body); + await Promise.all([postMessage(group.friend.id, body), groupUpdate]); }, async wipe() { @@ -281,6 +295,7 @@ const handler = { { console.debug("Processed private message", message); const messageEntry: IncomingMessage = { + type: "incoming", receivedAt: new Date(), sentAt: new Date(message.content.sent_at), text: message.content.text, @@ -295,7 +310,7 @@ const handler = { group.messages.push(messageEntry); await updateGroup(group); broadcastMessage({ - type: "Message received", + type: "Message added", groupId: group.id, message: messageEntry, }); -- 2.51.2